![](/img/trans.png)
[英]Scream of the day - Javascript serialising arrays in different ways
[英]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
合並range2
和range3
所有無效性。
令人驚訝的是,它的執行速度比range3
上的range3
快。 我不清楚為什么會這樣。 我想必須調查一下Javascript的特定實現才能弄清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.