javascript:通过循环内联10倍加速?

vol*_*tan 21 javascript memory performance

我在Firefox(13.0.1)中遇到了一个奇怪的javascript行为,遇到了性能问题.最新的Chrome显示相同的行为.

当我执行看起来像下面的代码片段的javascript代码时,结果非常慢.但是,如果我只是简单地将外部循环的内容放在'j'上,我的速度大约是10倍.对于我的示例应用程序,这意味着我只是分别为'j = 0'和'j = 1'的固定值写了两次,因为'm'等于2.当然,我不想要'm '要硬编码,所以我问自己在使用真正的循环时究竟是什么导致了这种减速?

有人有想法吗?

我在web worker中运行代码.奇怪的是,如果我在主javascript上下文中执行相同而不是worker的上下文,则不会发生内联的积极效果.然而,仅为一个'j'值执行循环内容会带来巨大的加速,这在所有情况下都有帮助.这可能与内存管理有关吗?

非常感谢提前!

//m: very small, 1-2
for (j = 0; j < m; ++j) {
  var attrib = attributes[j];

  //n: very large, ~3*10^6 elements
  for (i = 0; i < n; ++i) {

    var data = largeBuffer[i];

    //nc: very small, 2-3
    for (c = 0; c < nc; ++c) {
      var component;
      //compute 'component
      //..
      attrib.typedArray[baseIdx + c] |= component;
    }

    baseIdx += nc;
  }
}
Run Code Online (Sandbox Code Playgroud)

yad*_*taf 4

这只是一个假设。我不太了解JS解释器的内部结构。

也许当您内联外循环时,解释器会看到 4 次相同的代码,从而触发 JIT。相反,当您使用常规循环时,JIT 只会看到代码一次。

再次强调,这只是一个假设。