Javascript随机数组访问速度?
我有一个非常简单的javascript生活游戏实现,我想了解如何优化更新循环。使用Chrome的分析器,我得到。。。奇怪的结果,我不知道如何正确解释 这是执行几乎所有计算的循环的主要部分: (请注意,this.texArrs都初始化为Uint8Arrays,并且它们都比我实际使用的阵列宽2像素,以避免在此循环中进行任何越界检查)Javascript随机数组访问速度?,javascript,arrays,performance,Javascript,Arrays,Performance,我有一个非常简单的javascript生活游戏实现,我想了解如何优化更新循环。使用Chrome的分析器,我得到。。。奇怪的结果,我不知道如何正确解释 这是执行几乎所有计算的循环的主要部分: (请注意,this.texArrs都初始化为Uint8Arrays,并且它们都比我实际使用的阵列宽2像素,以避免在此循环中进行任何越界检查) var arr=newuint8array(this.h*this.w*4); var tArr0=this.texArrs[0]; var tArr1=this.te
var arr=newuint8array(this.h*this.w*4);
var tArr0=this.texArrs[0];
var tArr1=this.texArrs[1];
var ylen=这个.h;
var xlen=这个.w;
对于(变量y=1;y
运行探查器几秒钟,结果如下:
我不明白的是
1) 为什么前4个邻居计数呼叫比其他4个快10倍
2) 为什么在索引之间写入arr有如此大的差异
另外,一般来说,我将如何着手找出某些计算缓慢/需要避免的原因?这是一个更一般的问题,即RAM如何工作的基础(例如,为了优化代码以实现顺序数组访问),还是我最好深入研究语言细节(例如,在本例中为javascript/v8)?tArr0有多大?
w
和h
有多大?您使用一个数组来表示二维而不是使用二维数组(数组数组数组)有什么原因吗?整个屏幕大小约为1600x900,因此相当大。使用一维数组的原因是我一直在使用Uint8Array(它只能存储int)。编辑:实际上。。。。你认为在这种情况下使用二维数组会更快吗?我以为一个数组的数组会比只存储整数慢很多。。。。?
var arr = new Uint8Array(this.h * this.w * 4);
var tArr0 = this.texArrs[0];
var tArr1 = this.texArrs[1];
var ylen = this.h;
var xlen = this.w;
for (var y = 1; y < ylen; y++){
var thisRow = y * xlen,
prevRow = thisRow - xlen,
nextRow = thisRow + xlen,
arrRow = prevRow * 4;
for (var x = 1; x < xlen; x++) {
var pIdx = thisRow + x,
px = tArr0[pIdx],
arrIdx = arrRow + (x * 4),
neighborCount = 0,
prevCol = x - 1,
nextCol = x + 1;
// start slow part
neighborCount += tArr0[prevRow + prevCol];
neighborCount += tArr0[prevRow + x];
neighborCount += tArr0[prevRow + nextCol];
neighborCount += tArr0[thisRow + prevCol];
neighborCount += tArr0[thisRow + nextCol];
neighborCount += tArr0[nextRow + prevCol];
neighborCount += tArr0[nextRow + x];
neighborCount += tArr0[nextRow + nextCol];
// end slow part
if ((!px && neighborCount === 3) || (px && (neighborCount === 2 || neighborCount === 3))) {
tArr1[pIdx] = 1;
arr[arrIdx - 4] = 255;
arr[arrIdx - 3] = 255;
arr[arrIdx - 2] = 255;
arr[arrIdx - 1] = 255;
} else {
tArr1[pIdx] = 0;
arr[arrIdx - 4] = 0;
arr[arrIdx - 3] = 0;
arr[arrIdx - 2] = 0;
arr[arrIdx - 1] = 255;
}
}
}