繁体   English   中英

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

[英]Any way to improve JavaScript array performance?

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

作为比较ArrayFloat32ArrayFloat64Array性能的实验,我在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]);

差别不大。 实际上,编译器需要一些静态类型信息才能使bubbleSortarray参数真正获得不错的性能。 我们刚刚在JS中遇到了糟糕的阵列性能吗? 有什么方法吗? 没有使用ASM.js ......

您应该看到这样的答案: JavaScript中的对象/数组的性能如何? (专门针对Google V8)

特别是以下几点:

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

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

我有兴趣看看你是否使用文字语法[0,1,2,...,100000]声明一个数组,性能会更好吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM