2014-10-11 23 views
2

我剛剛發現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?看起來正常陣列的靈活性更強,同樣穩健,速度也更快。

+1

閱讀此:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays。主要用於處理來自外部世界的原始二進制數據,您想要通過javascript訪問這些數據。 – jfriend00 2014-10-11 21:42:13

+1

如果編譯器可以驗證典型數組的所有成員將始終是相同類型的成員,則可以使用類型化數組進行優化。在運行測試之前執行此操作:'a [0] = null'。在一個數學運算中,'null'將被視爲'0',但它在計時結果上會產生非常大的差異。在我的機器上,它從大約5ms到大約47ms。 – 2014-10-11 21:50:41

+0

我已經在WebGL和WebSockets中使用它們,它們都可以「按原樣」處理二進制數據,而不必將其引入「本地」JavaScript數組中。 – Adam 2015-01-30 20:50:55

回答

4

「性能」通常並不意味着腳本的運行速度。還有很多其他重要因素,比如它凍結你的電腦和/或崩潰的速度有多快。記憶。通常爲var分配的最小內存量是32位。這意味着

var a = true; 

在你的記憶的布爾看起來像這樣:

0000 0000 0000 0000 0000 0000 0000 0001 

這是一個巨大的浪費,而且通常不是一個問題,因爲沒有人使用它們的顯著足夠量爲它真的物。類型化數組適用於重要的情況,實際上可以減少大量內存使用量,例如處理圖像數據,聲音數據或各種原始二進制數據時。

另一個區別是,它允許您在某些情況下潛在地節省更多內存,因爲它允許您對通常按值傳遞的引用傳遞的數據進行操作。

考慮這種情況下:

var oneImage = new Uint8Array(16 * 16 * 4); 
var onePixel = new Uint8Array(oneImage.buffer, 0, 4); 

你現在有相同的ArrayBuffer 2條獨立意見,對同一數據進行操作,應用這一概念可以讓你不僅在你的記憶一個巨大的東西,它允許您實際上將其細分爲儘可能多的細分,因爲您目前只需很少的開銷即可開展工作,這可能更重要。

相關問題