我遇到了一个性能问题,因为我的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;
}
}发布于 2012-07-17 02:45:02
这只是一个假设。我不太了解JS解释器的内部结构。
也许当你内联外部循环时,解释器会看到4次相同的代码,从而触发JIT。相反,当您使用常规循环时,代码只被JIT看到一次。
再说一次,这只是一个假设。
https://stackoverflow.com/questions/11503757
复制相似问题