我剛剛發現Javascript已經通過this鏈接鍵入了數組。我立刻好奇這些對象在語言中的好處。Uint8Array Javascript usecase
我注意到UInt8Arrays丟失了.map()
類型的函數,我對正常的數組對象有這樣的功能,所以如果你想循環它們,你需要一個for
循環。
我認爲在使用UInt8Arrays時可能會有一些性能提升,但似乎並非如此。
var a = d3.range(225)
var b = new Uint8Array(d3.range(225))
console.time("a")
var result = 0;
for (var j = 10000; j >= 0; j--) {
for (var i = a.length - 1; i >= 0; i--) {
result += a[i];
};
};
console.timeEnd("a")
console.time("b")
var result = 0;
for (var j = 10000; j >= 0; j--) {
for (var i = b.length - 1; i >= 0; i--) {
result += b[i];
};
};
console.timeEnd("b")
我正在使用d3庫來快速生成大型數組。該腳本給出以下輸出:
a: 2760.176ms
b: 2779.477ms
因此,性能不會提高。當您插入錯誤的值時,UInt8Array也不會引發錯誤。
> new Uint8Array([1,2,3,4,'aasdf'])
[1,2,3,4,0]
考慮到這一點,什麼是正確使用情況下的Javascript UInt8Array
?看起來正常陣列的靈活性更強,同樣穩健,速度也更快。
閱讀此:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays。主要用於處理來自外部世界的原始二進制數據,您想要通過javascript訪問這些數據。 – jfriend00 2014-10-11 21:42:13
如果編譯器可以驗證典型數組的所有成員將始終是相同類型的成員,則可以使用類型化數組進行優化。在運行測試之前執行此操作:'a [0] = null'。在一個數學運算中,'null'將被視爲'0',但它在計時結果上會產生非常大的差異。在我的機器上,它從大約5ms到大約47ms。 – 2014-10-11 21:50:41
我已經在WebGL和WebSockets中使用它們,它們都可以「按原樣」處理二進制數據,而不必將其引入「本地」JavaScript數組中。 – Adam 2015-01-30 20:50:55