我正在将我的一些 OpenGL 代码移植到 WebGL,而 JavaScript 没有真正的数组这一事实令人难过。我可以使用 Float32Array
(以及其他 ArrayBuffer
类型),但这似乎对性能没有帮助。
作为比较 Array
与 Float32Array
与 Float64Array
性能的实验,我对 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]);
差别不大。实际上,编译器需要为 bubbleSort
的 array
参数提供一些静态类型信息,才能真正获得不错的性能。我们只是被 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/