Buffer是壹個典型的結合了Javascript和C++的模塊。性能相關部分用C++實現,非性能相關部分用javascript實現。
當節點啟動進程時,緩沖區已經被加載到內存中並放入全局對象中,因此不需要它。
緩沖對象:類似於數組,其元素是16中的兩位數。
緩沖存儲器分配
緩沖區對象的內存分配不在V8的堆內存中,內存應用在Node的C++級別實現。
為了更有效地使用應用內存,節點采用了slab分配機制。slab是壹種動態內存管理機制,適用於各種*nix操作系統。平板有三種狀態:
(1)完全:完全分配。
(2)部分:部分分配狀態
(3)空:未分配。
緩沖區轉換
緩沖區對象可以與字符串相互轉換,支持的編碼類型如下:
ASCII、UTF-8、UTF-16LE/UCS-2、Base64、二進制、十六進制
要緩沖的字符串
新緩沖區(字符串,【編碼】),默認UTF-8。
buf.write(字符串、【偏移量】、【長度】、【編碼】)
緩沖到字符串
buf.toString(【編碼】,【開始】,【結束】)
緩沖區不支持的編碼類型。
判斷是否受Buffer.isEncoding(編碼)支持
Iconv-lite:純javascript實現,重量更輕,性能更好,無需從C++轉換為JavaScript。
Iconv:調用C++的libiconv庫完成。
緩沖區拼接
註意“RES . on(‘data‘,function(chunk){ })”,其中參數chunk是緩沖區對象,直接用+拼接會自動轉換成字符串,可能會導致亂碼。
解決方案:
(1)通過可讀流中的setEncoding()方法,可以將數據事件作為編碼字符串而不是緩沖區對象進行傳遞,並且在內部使用StringEncoder模塊。
(2)將Buffer對象臨時存儲在數組中,最後組裝成壹個大的Buffer,然後編碼轉換成字符串輸出。
緩沖區廣泛應用於文件I/O和網絡I/O中,其性能非常重要,遠遠高於普通字符串的性能。
除了緩沖區和字符串之間轉換的性能損失之外,讀取文件時設置高水位線也非常重要。
a、高水位線設置對緩沖內存的分配和使用有壹定的影響。
b、highWaterMark設置太小,這可能會導致系統調用過多。
什麽時候應該使用緩沖區,什麽時候不應該使用?-純javascript支持unicode代碼,但不支持二進制代碼。在解決TCP流或文件流時,有必要處理流。當我們保存非utf-8字符串、二進制代碼和其他格式時,我們必須使用“緩沖區”。