javascript - 有什么方法可以提高 JavaScript 数组的性能?

标签 javascript arrays

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

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

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 的是...

最佳答案

您应该看到这个答案:What is the performance of Objects/Arrays in JavaScript? (specifically for Google V8)

特别是以下几点:

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

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

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

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

关于javascript - 有什么方法可以提高 JavaScript 数组的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199420/

相关文章:

javascript - 使用 Javascript 计算并显示文本框中的字符数

javascript - 谷歌映射多个自定义标记,其中的数字引用列表中的项目

javascript - 使用 JavaScript/jQuery 在 textarea 中呈现乘法和除法符号

javascript - 如何访问和处理嵌套对象、数组或 JSON?

java - 我如何清除整个数组?

java - 非静态时变量初始化的问题

引用数组位置(不是元素)的 Javascript 数组

javascript - 为什么有些 ajax 按钮不起作用?

php - 如果求和时单个数组两侧的值相等,则查找索引

javascript - 链接到 native Javascript 函数