有什么方法可以改善JavaScript数组的性能?

wco*_*ran 5 javascript arrays

我正在将一些OpenGL代码移植到WebGL,而且JavaScript没有真正的数组这一事实令人难过.我可以使用Float32Array(和其他ArrayBuffer类型),但这似乎没有帮助性能.

作为比较Arrayvs Float32ArrayFloat64Array性能的实验,我对100000个浮点数进行冒泡排序以查看是否存在任何差异:

function bubbleSort(array) {
    var N = array.length;
    for (var i = 0; i < N; i++) 
        for (var j = i; j < N-1; j++)
            if (array[j] > array[j+1]) {
                var tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
            }
}

// var nums = new Array(100000);        // regular 'JS' array
// var nums = new Float32Array(100000);   // actual buffer of 32-bit floats
var nums = new Float64Array(100000);   // actual buffer of 64-bit floats
for (var i = 0; i < nums.length; i++)
    nums[i] = Math.random() * 1000;

bubbleSort(nums);

for (var i = 0; i < nums.length; i++)
    console.log(nums[i]);
Run Code Online (Sandbox Code Playgroud)

差别不大.真正的编译器将需要为一些静态类型信息array的参数bubbleSort才能真正得到不俗的表现.我们刚刚在JS中遇到了糟糕的阵列性能吗?有什么方法吗?没有使用ASM.js ......

Jac*_*ack 5

您应该会看到这个答案:JavaScript 中对象/数组的性能是什么?(专门针对 Google V8)

特别是以下几点:

  • Array.push(数据); 比 Array[nextIndex] = data 快近 20 倍。
  • V8 数组写入比 V8 读取略快

所以是的,JS 中的数组索引看起来很慢。如果在性能测试中数组写入确实比读取快,那么动态分配很可能对数据的放置位置并不挑剔(最快的?),而在读取方面,这将是很多之间跳转的内存地址的数量会慢得多。

我很想知道您是否使用文字语法 [0, 1, 2, ..., 100000] 声明一个数组,性能会更好吗?

(如果我有时间,我会设置一个 JSPerf)。