- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们有一个 Angular 2 站点,其中有一个 websocket 将数据从后端泵入我们的网格。为了指示最近的更新,我们使用 CSS 设置行的背景颜色和受影响的单元格上的粗体。
指示应该只持续很短的时间。
1) 我们的第一次尝试是在下一批从服务器到达时重置所有指标。这运行良好,但在某些 View 中很少有更新,这意味着指标可以保持很长时间,这有点令人困惑。
如果更新指示器在固定时间间隔(例如 4 秒)后消失会更加一致。
2) 我们的下一个尝试是使用 CSS 动画。但是过了一会儿,它就滞后了很多。给人的印象是运行过多的动画会使浏览器过载,无法处理请求的时间。也许每个动画在后台都有自己的计时器?
3) 第三种尝试是让一个计时器以固定的时间间隔运行,然后检查要重置哪些记录。我们创建了一个 TimerService,它将定期检查到期元素。将元素添加到计时器池时,可以配置任意等待时间。
这行得通,但是在日志窗口中经常出现违规警告:
[Violation] 'setInterval' handler took 56ms
[Violation] 'setInterval' handler took 74ms
[Violation] 'setInterval' handler took 63ms
[Violation] 'setInterval' handler took 88ms
...
但是当我们对 checkItems 方法内部发生的事情进行计时时,它只需要 0.03 毫秒!
我们都有 C# 背景并且刚刚使用 Angular 几个月。也许我们正在实现后端方法?
是否发生了我们错过的上下文切换?
有没有更前端友好的替代方法?
我们可以对我们的代码进行一些重要的优化吗?
感谢所有建议!
这是导致所有警告的建议 TimerService:
import { Injectable, OnInit } from "@angular/core";
import { Observable } from "rxjs/Rx";
import { Subject } from "rxjs/Subject";
@Injectable()
export class TimerService {
private timerItems: TimerItem[] = [];
private dueTimeReachedSubject: Subject<string> = new Subject<string>();
public dueTimeReached: Observable<string> = this.dueTimeReachedSubject.asObservable();
constructor() {
setInterval(() => this.checkItems(), 1000);
}
private checkItems() {
let now = Date.now();
let removeKeys: string[] = [];
this.timerItems.filter(t => t.dueTime <= now).forEach(t => {
this.dueTimeReachedSubject.next(t.key);
removeKeys.push(t.key);
});
this.timerItems = this.timerItems.filter(t => removeKeys.indexOf(t.key) < 0);
}
public add(key: string, delayInSeconds: number) {
let dueTime = Date.now() + delayInSeconds * 1000;
let timerItem = this.timerItems.find(t => t.key === key);
if (timerItem) {
timerItem.dueTime = dueTime;
}
else {
this.timerItems.push(new TimerItem(key, dueTime));
}
}
public remove(key: string) {
this.timerItems = this.timerItems.filter(t => t.key !== key);
}
}
class TimerItem {
constructor(public key: string, public dueTime: number) { }
}
编辑
我尝试使用 Observable.interval: Same result with exactly the same warning message: "[Violation] 'setInterval' handler take xx ms"
我尝试将 setTimeout 用于重复调用:相同的结果,但修改了警告消息:“[Violation] 'setTimeout' 处理程序占用了 xx 毫秒”
我什至尝试清空每一行的 checkItems,但我仍然收到警告。
警告是从 zone.js 内部抛出的,似乎是 Angular 内部推荐。我知道我可以在 Chrome 开发者工具中关闭详细日志记录,但我经常将 console.debug 用于开发目的,这意味着它们也会消失。
我猜对于慢速函数来说警告是可以的,但在这种情况下它只是触发一个 setInterval 函数。为什么会这么慢?
最佳答案
在这样的站点中可以做很多事情。
第一个是将 ChangeDetectionStrategy 更改为 ChangeDetectionStrategy.onPush ,然后仅在需要时激活检测,在您的情况下,在 checkItems 的末尾添加和删除.这将大大减少脚本编写,因为只有在被询问时,angular 才需要评估您的 html
你可以做的第二件事是检查你的寺庙是否有一个函数调用在 *ngIf或 *ngFor,如果你这样做,angular 将无法缓存此函数返回的值,并且必须为每次检查处理它们
您应该考虑的第三件事是优化 checkItems,在 O(n^2) 中运行 checkItems 并执行许多不必要的循环。你可以减少它
checkItems() {
this.timerItems = this.timerItems.filter(t => {
if(t.dueTime <= now){
this.dueTimeReachedSubject.next(t.key);
return false;
}
return true;
});
}
对于小型阵列,它不会有太大帮助,但越大,这个变化就会开始生效..
我想还有更多事情可以做,但这 3 件事帮助我解决了类似的性能问题
关于javascript - 在 Angular 2 中应用频繁 CSS 更改的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043151/
我遇到了一个奇怪的问题。我有这个: $(document).ready(function () {
我正在编写一个程序,它从列表中读取一些 ID,从中找出不同的 URL,然后将图像保存到我的 C: 驱动器中。 如果我在浏览器中导航到图像 URL,它们就会起作用。此外,如果我尝试从不同的服务器获取图像
我编写了一个 REST WCF RIA Silverlight 4.0 兼容服务,我可以从 javascript + jQuery.1.4.2.js + JSON2.js(当然,还可以从 .NET 4
我很确定这个网站实际上还没有得到回答。一劳永逸地,与 32 位有符号整数范围内的数字字符串匹配的最小正则表达式是什么,范围是 -2147483648至 2147483647 . 我必须使用正则表达式进
我有两个data.table;我想从那些与键匹配的元素中随机分配一个元素。我现在这样做的方式相当慢。 让我们具体点;这是一些示例数据: dt1<-data.table(id=sample(letter
我已经安装了 celery 、RabitMQ 和花。我可以浏览到花港。我有以下简单的工作人员,我可以将其附加到 celery 并从 python 程序调用: # -*- coding: utf-8 -
我正在使用 ScalaCheck 在 ScalaTest 中进行一些基于属性的测试。假设我想测试一个函数,f(x: Double): Double仅针对 x >= 0.0 定义的, 并返回 NaN对于
我想检查文件是否具有有效的 IMAGE_DOS_SIGNATURE (MZ) function isMZ(FileName : String) : boolean; var Signature: W
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我在工作中查看了一些代码,发现了一些我以前没有遇到过的东西: for (; ;) { // Some code here break; } 我们一直调用包含这个的函数,我最近才进去看看它是
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我试图编写一个函数,获取 2D 点矩阵和概率 p 并以概率 p 更改或交换每个点坐标 所以我问了一个question我试图使用二进制序列作为特定矩阵 swap_matrix=[[0,1],[1,0]]
这个问题在这里已经有了答案: Using / or \\ for folder paths in C# (5 个答案) 关闭 7 年前。 我在某个Class1中有这个功能: public v
PostgreSQL 10.4 我有一张 table : Column | Type ------------------------- id | integer| title
我正在 Postgresql 中编写一个函数,它将返回一些针对特定时区(输入)计算的指标。 示例结果: 主要问题是这只是一个指标。我需要从其他表中获取其他 9 个指标。 对于实现此目标的更简洁的方法有
我需要在 python 中模拟超几何分布(用于不替换采样元素的花哨词)。 设置:有一个装满人口许多弹珠的袋子。弹珠有两种类型,红色和绿色(在以下实现中,弹珠表示为 True 和 False)。从袋子中
我正在使用 MaterializeCSS 框架并动态填充文本输入。我遇到的一个问题是,在我关注该字段之前,valid 和 invalid css 类不会添加到我的字段中。 即使我调用 M.update
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我希望你们中的一位能向我解释为什么编译器要求我在编译单元中重新定义一个静态固定长度数组,尽管我已经在头文件中这样做了。这是一个例子: 我的类.h: #ifndef MYCLASS_H #define
我正在使用旧线程发布试图解决相同问题的新代码。什么是安全 pickle ? this? socks .py from socket import socket from socket import A
我是一名优秀的程序员,十分优秀!