我正在将一些OpenGL代码移植到WebGL,并且JavaScript没有真正的数组这一事实令人悲伤。我可以使用Float32Array
(和其他ArrayBuffer
类型),但这似乎不会有助于提高性能。
作为比较Array
与Float32Array
与Float64Array
效果的实验,我在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]);
差别不大。实际上编译器需要array
bubbleSort
参数的一些静态类型信息才能真正获得不错的性能。我们刚刚在JS中遇到了糟糕的阵列性能吗?有什么方法吗?没有使用ASM.js ......
答案 0 :(得分:3)
你应该看到这个答案:What is the performance of Objects/Arrays in JavaScript? (specifically for Google V8)
特别是以下几点:
所以是的,看起来JS中的数组索引很慢。如果确实数组写入比性能测试中的读取更快,那么动态分配可能不是它放置数据的位置(最快的第一个?),而在读取时,这将是很多内存地址之间的跳转会慢得多。
我有兴趣看看你是否使用文字语法[0,1,2,...,100000]声明一个数组,性能会更好吗?
(如果我有时间的话,我会设置一个JSPerf。)