簡體   English   中英

創建Javascript數組的不同方法

[英]Different ways to create Javascript arrays

我想了解構造數組的性能差異。 運行以下程序,我對以下輸出感到困惑:

Time for range0: 521
Time for range1: 149
Time for range2: 1848
Time for range3: 8411
Time for range4: 3487

我不明白為什么3比4花費更長的時間,而1比2花費更短的時間。而且,似乎map函數的效率很低; 有什么用?


 function range0(start, count) { var arr = []; for (var i = 0; i < count; i++) { arr.push(start + i); } return arr; } function range1(start, count) { var arr = new Array(count); for (var i = 0; i < count; i++) { arr[i] = start + i; } return arr; } function range2(start, count) { var arr = Array.apply(0, Array(count)); for (var i = 0; i < count; i++) { arr[i] = start + i; } return arr; } function range3(start, count) { var arr = new Array(count); return arr.map(function(element, index) { return index + start; }); } function range4(start, count) { var arr = Array.apply(0, Array(count)); return arr.map(function(element, index) { return index + start; }); } function profile(range) { var iterations = 100000, start = 0, count = 1000, startTime, endTime, finalTime; startTime = performance.now(); for (var i = 0; i < iterations; ++i) { range(start, count); } endTime = performance.now(); finalTime = (endTime - startTime); console.log(range.name + ': ' + finalTime + ' ms'); } [range0, range1, range2, range3, range4].forEach(profile); 

我不明白為什么3比4花費更長的時間

我也不。 鑒於我的膚淺分析以及通過分析代碼獲得的結果,這是一個令人驚訝的結果。 在運行谷歌瀏覽器50我的電腦, range4相比是慢一倍range3

我必須研究您正在使用的Javascript實現,以弄清楚為什么會發生這種情況。

而1比2短。

range1執行更快,因為它使用循環並優化了內存分配,而range2使用了函數並執行了不必要的內存分配。

同樣,地圖功能似乎效率很低。 有什么用?

map函數用於根據現有Array的值來計算新Array

[1, 2, 3, 4, 5].map(number => number * number);
// [1, 4, 9, 16, 25]

在我的電腦上

Time for range0: 783
Time for range1: 287
Time for range2: 10541
Time for range3: 14981
Time for range4: 28243

我的結果反映了我對每個功能性能的期望。

對每個功能的淺析

  • range0

    創建一個Array並通過循環填充它。 這是最簡單直接的代碼。 我想可以將其理解為性能比較的基准

  • range1

    使用帶有length參數的Array構造函數。 這極大地優化了存儲元素所需的基礎內存分配。 由於元件的確切數目是預先已知的,所述存儲器不必須realloc ated作為元素的數量的增加; 實例化Array時,可以僅分配一次存儲所有元素所需的確切內存量。

  • range2

    適用 參數列表的構造函數,用this設置為數字0 從語義上講,它等效於Array() –使用count參數創建的參數列表與函數應用程序的結果無關。 實際上,它不必要地浪費時間為空的參數列表分配內存。

    您可能打算使用call

     Array.call(null, count) 
  • range3

    類似於range1 ,但使用帶函數而不是循環的map 初始內存分配已優化,但是調用函數count時間的開銷可能很大。

    另外, map生成一個新的Array實例。 由於該實例還具有count元素,因此也應該優化內存分配,但是我不清楚這種情況是否確實發生。 但是,正在進行兩個單獨的內存分配,而不是range1

  • range4

    合並range2range3所有無效性。

    令人驚訝的是,它的執行速度比range3上的range3快。 我不清楚為什么會這樣。 我想必須調查一下Javascript的特定實現才能弄清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM