Javascript随机数组访问速度?

时间:2017-03-14 13:11:02

标签: javascript arrays performance

我在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;
    }
  }
}

运行探查器几秒钟,结果就是:

Profiler result

我不明白的是 1)为什么前4个neighborCount调用比其他4个调用快10倍 2)为什么写入arr在索引之间是如此截然不同

另外,我一般会如何找出为什么某些计算缓慢/无法避免?这是更普遍的事情,即RAM工作原理的基础知识(例如,为了优化代码顺序数组访问),或者我最好是潜入语言细节(即在这种情况下是javascript / v8)?

0 个答案:

没有答案