Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript随机数组访问速度?_Javascript_Arrays_Performance - Fatal编程技术网

Javascript随机数组访问速度?

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

我有一个非常简单的javascript生活游戏实现,我想了解如何优化更新循环。使用Chrome的分析器,我得到。。。奇怪的结果,我不知道如何正确解释

这是执行几乎所有计算的循环的主要部分: (请注意,this.texArrs都初始化为Uint8Arrays,并且它们都比我实际使用的阵列宽2像素,以避免在此循环中进行任何越界检查)

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