即使您使用Array
,現代引擎也會在幕後使用真實數組,如果您認爲他們可以使用Array
,如果您執行的操作使他們認爲無法使用真數組,則會回退到屬性映射「數組」。
還要注意,如radsoc points out,var buffer = new ArrayBuffer(0x10000)
然後var Uint32 = new Uint32Array(buffer)
產生UINT32數組,其尺寸是0x4000的(0x10000的/ 4),而不是爲0x10000,因爲你給ArrayBuffer
值以字節爲單位,但當然也有每Uint32Array條目四個字節。以下全部使用new Uint32Array(0x10000)
而不是(並且始終如此,甚至在此編輯之前)來比較蘋果和蘋果。
所以,讓我們從這裏開始,與new Uint32Array(0x10000)
:http://jsperf.com/array-access-speed-2/11(可悲的是,JSPerf已經失去了本次測試及其結果,而現在處於脫機狀態完全)
這表明,因爲你」以簡單,可預測的方式重新填充陣列,現代引擎繼續使用真正的陣列(以及其性能優勢),而不是轉移。我們看到兩者的表現基本相同。速度的差異可能與類型轉換有關,其中的值爲Uint32
,並將其作爲sum
作爲number
(儘管如果該類型轉換未延遲,我感到很驚訝...)。
添加一些混亂,但:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
for (var i = 0x10000 - 1; i >= 0; --i) {
Uint32[Math.random() * 0x10000 | 0] = (Math.random() * 0x100000000) | 0;
arr[Math.random() * 0x10000 | 0] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
...使發動機具有依傍老式的屬性映射「陣列」,你看到被打的陣列明顯優於老式類型:http://jsperf.com/array-access-speed-2/3(可悲的是,JSPerf已經失去了這個測試及其結果)
聰明,這些JavaSc ript引擎工程師...
但是,您對Array
數組的非數組屬性所做的具體事情很重要;考慮:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
arr.foo = "bar"; // <== Non-element property
for (var i = 0; i < 0x10000; ++i) {
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
這仍然填充陣列可預見的,但我們非元素屬性(foo
)添加到它。 http://jsperf.com/array-access-speed-2/4(可悲的是,JSPerf已經失去了這個測試及其結果)顯然,引擎是相當聰明,並保留非元素屬性到一邊,而繼續使用的元素屬性一個真正的數組:
我在一個小的損失來解釋爲什麼標準陣列應該得到更快有相比,我們的第一個測試上方。測量錯誤?迷宮在Math.random
?但是我們仍然確信Array
中的陣列特定數據仍然是一個真正的數組。
而如果我們做同樣的事情,但以相反的順序填寫:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
arr.foo = "bar"; // <== Non-element property
for (var i = 0x10000 - 1; i >= 0; --i) { // <== Reverse order
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
...我們回到類型數組勝出 —除了在IE11:http://jsperf.com/array-access-speed-2/9(可悲的是,JSPerf有失去了這個測試及其結果)
您是否刪除了jsperf測試?我無法再訪問它們 – Bergi
不,我沒有刪除它。這很奇怪。 –
很奇怪,他們會像那樣消失!所有這些......根據[這個FAQ條目](http://jsperf.com/faq#test-availability)特別奇怪。我搜索過萬一URL改變了,或者什麼都沒有。我可以找到陣列表現的其他測試,但不是Sukhanov和我的。我提出了一個[問題](https://github.com/mathiasbynens/jsperf.com/issues/197)。當然,如果我們中的更多人[捐獻給jsPerf](http://jsperf.com/faq#donate)(我剛剛做了......第一次*鴨頭*),它可能不會受到傷害。 –