21

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

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

有人有想法吗?

我正在网络工作者中运行代码。奇怪的是,如果我在主 javascript 上下文中执行相同的内联,而不是在工作人员的上下文中执行内联,则不会出现内联的积极影响。尽管如此,只为一个 '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;
  }
}
4

1 回答 1

4

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

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

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

于 2012-07-16T18:45:02.253 回答