我正在将我的一些OpenGL代码迁移到WebGL,JavaScript没有真正的数组这一事实让我感到难过。我可以使用Float32Array(以及其他ArrayBuffer类型),但这似乎并没有帮助提高性能。
为了比较Array与Float32Array与Float64Array的性能,我进行了一个实验,在100000个浮点数上计时气泡排序,看看是否有任何差别:
为了比较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]);
差别不大。实际上,编译器需要一些静态类型信息来优化bubbleSort
函数中的array
参数,以获得更好的性能。我们在JS中只能忍受糟糕的数组性能吗?有没有其他方法可以解决这个问题?除了使用ASM.js之外...
Math.random()
导致性能问题吗? - RobbubbleSort
并立即完成。 - wcochran