我目前正在集成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使用率会损害导航页面时的用户体验。

最佳答案

我注意到我两次导入了LoadingBarModule(在主模块和组件模块中)。从组件模块中删除导入可解决此问题。

关于css - Angular2 [style.width]绑定(bind)高CPU使用率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51360444/

10-11 11:13