2014-10-05 60 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