圖說c語言
『壹』 2.(譯)圖說前端-ArrayBuffers 和 SharedArrayBuffers
在 上一篇文章 ,我們深入探討了自動與手動內存管理在JavaScript與C語言中的應用。當我們討論 ArrayBuffers 和 SharedArrayBuffers 時,為何我們需要了解內存管理?因為ArrayBuffers提供了在具有自動內存管理功能的JavaScript中進行手動內存管理的方式。然而,這背後的原因是什麼呢?
自動內存管理雖然簡化了開發,但可能帶來性能問題,特別是當引擎對變數類型的推測導致內存浪費時。例如,JS引擎為變數預留的內存可能比實際需要的多2至8倍,從而浪費大量內存。同時,某些JS對象的創建模式可能使垃圾回收更加困難。
手動內存管理能提供更靈活的內存分配和更有效的垃圾回收策略,尤其在需要最大化代碼性能的場景下。ArrayBuffers和SharedArrayBuffers為開發者提供了這樣的選擇。
ArrayBuffers在使用上類似JavaScript數組,但不同的是,你只能存放位元組(二進制,用數字0與1表示)。ArrayBuffer本身只包含0與1的組合,而不知道位元組之間的區分。為了將數據放入,需要通過所謂的視圖來實現,比如類型化數組。
例如,你可以使用Int8視圖分解為8位位元組,或者使用無符號Int16視圖分解為16位位元組。同一基本緩沖區上可以擁有多種視圖,不同的視圖在相同操作下會產生不同結果。
ArrayBuffers模擬了直接操作內存訪問的語言如C的特性。為何不直接提供內存訪問許可權?主要是為了安全,直接訪問內存可能導致安全漏洞。
接下來,我們介紹SharedArrayBuffers。為了解釋SharedArrayBuffers,我們需要了解並行與JavaScript運行代碼的概念。並行運行代碼可以加速任務處理或提高對用戶事件的響應速度,但有時需要拆分任務。在JavaScript中,線程可以加速任務處理,但它們通常不共享內存。
SharedArrayBuffers允許多個線程(包括web worker)從同一內存塊中讀寫數據,從而避免了postMessage的通信開銷和延遲。然而,直接訪問兩個線程的共享內存可能導致競態條件,需要在後續文章中詳細討論。
SharedArrayBuffers在大多數瀏覽器中即將得到廣泛支持,但建議應用程序開發者使用更高的抽象級別。JavaScript庫開發者可以封裝SharedArrayBuffers,提供更簡單、更安全的使用方式。WebAssembly的實現將進一步利用SharedArrayBuffers,使並發性能得到提高。
在 下一篇文章 ,我們將探索用於建立這些抽象的工具(如原子),同時避免競態條件。