我目前正在集成Angular(6.0)的顶部进度指示器。
我尝试了多个npm程序包,但是当我启动进度加载程序时,所有程序包都遭受CPU使用率高的困扰。
Chrome任务管理器报告50-80%的CPU使用率。这是以下程序包中的一个最小示例:https://github.com/aitboudad/ngx-loading-bar
模板:
<ng-container *ngIf="(loader.progress$|async) as progress">
<div class="bar" [style.width.%]="progress">
</div>
</ng-container>
服务:
@Injectable()
export class LoadingBarService implements OnDestroy {
readonly progress$ = (new Subject<number>()).pipe(debounceTime(0)) as Subject<number>;
private _pendingRequests = 0;
private _value = 0;
private _incTimeout: any;
start(initialValue = 2) {
++this._pendingRequests;
if (this._value === 0 || this._pendingRequests === 1) {
this.set(this._pendingRequests === 1 && this._value > 0 ? this._value : initialValue);
}
}
set(n) {
if (n === 0 && this._pendingRequests > 0) {
n = 2;
}
this._value = n;
this.progress$.next(n);
if (this._pendingRequests === 0) {
return;
}
clearTimeout(this._incTimeout);
if (this._value > 0 && this._value < 100) {
this._incTimeout = setTimeout(() => this.increment(), 250);
}
}
}
如您所见,该值仅每250ms更新一次。但是CPU使用率始终保持在60-70%(一个内核)。
当我删除绑定[style.width.%]
时,CPU使用率下降到5-10%。
更新样式宽度真的很昂贵吗?
是否有更好(更快)的方式来更新样式的宽度?
由于显示加载程序时CPU使用率很高,因此导航页面时会损害用户体验。
答案 0 :(得分:1)
我注意到我两次导入了LoadingBarModule(在主模块和组件模块中)。从组件模块中删除导入即可解决此问题。