JavaScript - 为什么比按位运算更快地从数组中读取数据

时间:2018-02-27 12:04:37

标签: javascript arrays performance

我创建了简单的基准测试,如果从uint8数组中读取更多元素更快,从uin32数组中读取更少的元素并使用按位操作:

var rawData1 = new Uint8Array(800*600);
var rawData2 = new Uint8Array(800*600);
var rawData = new Uint8Array(800*600*2);

var j = 0;
for (var i = 0; i < rawData1.length; i++)
{
    rawData1[i] = i % 64;
    rawData2[i] = (i + 1) % 64;
    rawData[j] = rawData1[i];
    j++;
    rawData[j] = rawData2[i];
    j++;
}

var count = rawData1.length - 800;
var count2 = count / 2;

//==================================================================
var sum = 0;
var t0 = performance.now();

for (var i = 0; i < count; i += 2){ 
    sum += rawData1[i];
    sum += rawData2[i];
    sum += rawData1[i + 1]; 
    sum += rawData2[i + 1];
    sum += rawData1[i + 800];   
    sum += rawData1[i + 800 + 1];
    sum += rawData2[i + 800];
    sum += rawData2[i + 800 + 1];

}
var t1 = performance.now();
console.log("#1 took " + (t1 - t0) + " milliseconds.");
console.log("" + sum);

//=======================================================================

var data32 = new Uint32Array(rawData.buffer)
var sum2 = 0;

t0 = performance.now();

for (var i = 0; i < count2; i++){   
    var val = data32[i];
    sum2  += (val & 0x000000ff);        
    sum2  += (val & 0x0000ff00) >> 8;
    sum2  += (val & 0x00ff0000) >> 16;
    sum2  += (val & 0xff000000) >> 24;

    val = data32[i + 400];
    sum2  += (val & 0x000000ff);        
    sum2  += (val & 0x0000ff00) >> 8;
    sum2  += (val & 0x00ff0000) >> 16;
    sum2  += (val & 0xff000000) >> 24;  
}
t1 = performance.now();
console.log("#2 took " + (t1 - t0) + " milliseconds.");
console.log("" + sum2);

两个总和(sumsum2)是相同的,因此计算是正确的。但是,使用按位运算的第二个代码较慢(大约10%)。 为什么?我希望,从内存读取应该比从变量读取并使用按位操作(或者比内存访问更快)更慢。

0 个答案:

没有答案