2014-10-05 69 views
5

我正在将一些OpenGL代码移植到WebGL,而JavaScript没有真正的数组这一事实令人伤心。我可以使用Float32Array的(和其他ArrayBuffer类型),但这似乎不能帮助性能。任何提高JavaScript数组性能的方法?

作为一个实验来比较Array VS Float32Array VS 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参数的一些静态类型信息才能真正获得体面的性能。我们只是在JS中遇到糟糕的数组性能吗?任何方式在这个?短期使用ASM.js那就是......

+4

你是怎么测试这个的?你确定它不是'Math.random()'被称为100k次,这会导致你的性能问题? – Rob 2014-10-05 03:52:19

+1

@Rob立即删除'bubbleSort'并完成其结束。 – wcochran 2014-10-05 04:10:27

+2

“泡沫排序”和“表演”的帖子似乎是一种矛盾。 – user949300 2014-10-05 04:36:48

回答

3

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

特别是以下几点:

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

所以,是的,它看起来像数组索引是在JS慢。如果数组写入比性能测试中的读取速度快,那么动态分配可能对数据放置位置(最快的第一个?)没有挑剔,然而当涉及到读取时,这将是很多的的内存地址之间跳转,所以会慢得多。

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

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

+0

非常好 - 谢谢!我想象一些(早期的)实现只是在被视为字符串的索引上进行散列 - 然后当然删除应该很快。我正在测试使用V8的节点。更多测试.... – wcochran 2014-10-05 13:48:59