【发布时间】:2013-07-09 03:17:00
【问题描述】:
这在某种程度上是我的previous question 的后续。
我创建了a jsPerf,它比较了获取 RGB 像素值的一维数组的多种方法
var rgb = [R, G, B, R, G, B...]
并将这些转换为 HTML5 画布的 RGBA 值(其中 alpha 通道始终为 255,完全不透明)。
var rgba = [R, G, B, 255, R, G, B, 255...]
在我的测试中,我发现我测试的一个名为“For Loop”的循环比其他循环慢得多。在其他循环完成操作每秒数亿次的情况下,它以每秒高达 86 次的速度完成。该循环可以在上面的 jsPerf 链接中找到,但这里有一些带有“For Loop”和“4*unrolled,skip alpha”的代码,这是测试中更快的循环之一。
//Setup for each test
function newFilledArray(length, val) {
var array = Array(length);
for (var i = 0; i < length; i++) {
array[i] = val;
}
return array;
}
var w = 160; //width
var h = 144; //height
var n = 4 * w * h; //number of length of RGBA arrays
var s = 0, d = 0; //s is the source array index, d is the destination array index
var rgba_filled = newFilledArray(w*h*4, 255); //an RGBA array to be written to a canvas, prefilled with 255's (so writing to the alpha channel can be skipped
var rgb = newFilledArray(w*h*3, 128); //our source RGB array (from an emulator's internal framebuffer)
//4*unrolled, skip alpha - loop completes (exits) 185,693,068 times per second
while (d < n) {
rgba_filled[d++] = rgb[s++];
rgba_filled[d++] = rgb[s++];
rgba_filled[d++] = rgb[s++];
d++;
}
//For Loop - loop completes (exits) 85.87 times per second
for (var d = 0; d < n; ++d) {
rgba_filled[d++] = rgb[s++];
rgba_filled[d++] = rgb[s++];
rgba_filled[d++] = rgb[s++];
}
它怎么会在语法上如此相似,但在性能方面却相去甚远?
【问题讨论】:
-
你有没有试过切换循环的顺序
-
您是否尝试过使用
dis()? -
@aaronman 你是什么意思? jsperf 在全新的 JS 环境中运行每个测试。
-
没看问题就看代码了,我的坏@Barmar
-
第一个指标表明这些基准不太对劲,如果整个 while 循环真的每秒运行那么多次,那意味着它执行了大约 290 万亿 每秒操作数!那必须是浏览器/ CPU 组合的一大特色。因此,并不是 for 循环异常缓慢(不是;它每秒执行大约 1.34 亿次操作),而是 while 循环显示的速度快得离谱。
标签: javascript performance loops