javascript - 优化击倒/TKO - Alpha3

标签 javascript performance optimization knockout.js

现代化进程中Knockout对于 4.0 版(现在位于 monorepo tko ),我遇到了一些性能问题。

在其他变化中,一些内部循环的东西已经转换为 ES6 类,这导致了一些主要的性能问题。我不想撤销这项工作,因为它为一些关键代码增加了相当多的清晰度,所以我想征求一些关于如何改进 ES6 代码的意见。

我在这里设置了一些用于分析的简单示例:

Knockout Alpha2 - 349 毫秒

Knockout Alpha3 (prerelease) - 622 毫秒

jsFiddles 中的代码如下,它是许多绑定(bind)所经历的减速的原型(prototype)。

HTML:

<div id='x'>
  <strong>{{ count }} / {{ time }} ms</strong>
  <custom-component></custom-component>
</div>

<div id='cc-template'>
   cc
   {{# unless: finished }}
      <custom-component></custom-component>
   {{ /unless }}
</div>

Javascript:

let count = ko.observable(0)
let time = ko.observable(false)
const start = performance.now()
const ITERATIONS = 1000

class viewModel {
  constructor () {
    this.finished = count() > ITERATIONS
    count(count() + 1)
    time(performance.now() - start)
  }
}

ko.components.register("custom-component", {
  viewModel, template: {element: 'cc-template'}
})

ko.applyBindings({count, time}, document.getElementById('x'))

如果比较 Javascript 配置文件,调用树几乎相同(尽管 ES6 发生了变化)。看起来 Alpha3 中的额外时间是在叶调用上,这使得它们更难识别,所以我根据配置文件比较推测问题有几个方面,包括:

  • 一些非优化或反优化的情况
  • 一些循环替换为较慢的本地调用,例如Array.from
  • 更多的中间小垃圾回收
  • 对 ES6isms 的原生优化较少

无论如何,我还没有找出问题所在(如果有的话)——或者它们可能发生的确切位置。

我将非常感谢您提供见解并帮助确定我们可以在哪些方面进行优化以使性能恢复到甚至高于标准水平。

最佳答案

为了整合任何答案,我已经开始将答案作为 wiki:

  • 使用 templateif/ifnot/unless/with 移除不合适和不必要的依赖链/elseforeach 绑定(bind) — 3074AA9

关于javascript - 优化击倒/TKO - Alpha3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44414554/

相关文章:

javascript - 将 div(带有边框和填充)悬停在 Canvas 元素的中心?

javascript - 当乒乓 Racket 移动时, Canvas 球会朝错误的方向弹跳

javascript - 加载 html 或 JavaScript 文件作为 iframe 源

performance - 当两个输入集之一是普通集时,zinterstore 会更快/更慢吗?

javascript - 使用 KineticJS 提高动画性能

php - mySQL:更新大型数据库中记录的最有效方法?

javascript - jQuery fadeIn() 具有多个 div 的不同间隔

javascript - Firebase 未使用浏览器 API 设置数据

c - 点积 - SSE2 与 BLAS

optimization - 更好的初始猜测可能对优化收敛更差