我在javascript中有一个非常简单的生命游戏实现,想要找出如何优化更新循环。使用Chrome的分析器,我得到了......奇怪的结果,我不确定如何正确解释。
这是循环的主要部分,几乎完成了所有计算: (注意,this.texArrs都被初始化为Uint8Arrays并且它们都比我实际使用的宽2像素并且更高,以避免在此循环中进行任何越界检查)
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;
}
}
}
运行探查器几秒钟,结果就是:
我不明白的是 1)为什么前4个neighborCount调用比其他4个调用快10倍 2)为什么写入arr在索引之间是如此截然不同
另外,我一般会如何找出为什么某些计算缓慢/无法避免?这是更普遍的事情,即RAM工作原理的基础知识(例如,为了优化代码顺序数组访问),或者我最好是潜入语言细节(即在这种情况下是javascript / v8)?