JavaScript は文字列処理に非常に適しており、ワイドバイト文字列であってもシングルバイト文字列であっても文字列とみなされます。ノードは、ネットワーク プロトコルの処理、データベースの操作、画像の処理、ファイルのアップロードなどを行う必要があります。また、大量のバイナリ データを処理する必要もあります。そのため、組み込みの文字列ではこれらの要件を満たしていないため、Buffer が登場しました。
バッファの構造
バッファはJavaScriptとC++を組み合わせた代表的なモジュールで、性能に関わる部分はC++で実装され、性能に関係ない部分はJavaScriptで実装されます。
ノードは、プロセスの開始時にすでにバッファをメモリにインストールし、グローバルオブジェクトに配置しているため、requireする必要はありません
バッファオブジェクト: 配列と同様に、その要素は2桁の16進数です。
バッファ メモリの割り当て
バッファ オブジェクトのメモリ割り当ては、V8 のヒープ メモリにはありません。メモリ アプリケーションは Node の C++ レベルで実装されます。
要求されたメモリを効率的に使用するために、Node はスラブ割り当てメカニズムを採用しています。スラブは、さまざまな *nix オペレーティング システムを適用する動的メモリ管理メカニズムです。スラブには 3 つの状態があります:
(1) full: 完全に割り当てられた状態
(2) Partial: 部分的に割り当てられた状態
(3) empty: 割り当てられていない状態
バッファ変換
バッファオブジェクトは文字と組み合わせることができます文字列を相互に変換します。サポートされているエンコード タイプは次のとおりです:
ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex
String to Buffer
new Buffer(str, [エンコーディング])、デフォルトは UTF-8 です
buf.write(string, [offset], [length], [encoding])
文字列へのバッファ
buf.toString([encoding], [start], [終了])
Buffer でサポートされていないエンコーディング タイプ
サポートされているかどうかを判断するには Buffer.isEncoding(encoding) を使用してください
iconv-lite: 純粋な JavaScript 実装、軽量、パフォーマンスが向上、C++ から JavaScript への変換は不要
iconv: C++ の呼び出し libiconv ライブラリは、
Buffers
「res.on('data', function(chunk) {})」の結合を完了します。ここで、パラメーター チャンクは、直接使用されている Buffer オブジェクトです。 + スプライシングにより、ワイドバイト文字の場合、文字化けが発生する可能性があります。
(1) このメソッドは、読み取り可能なストリームの setEncoding() メソッドを通じて、データを作成できます。イベント配信は Buffer オブジェクトではなく、エンコーディングになります。その後の文字列は内部で StringEncoder モジュールを使用します。
(2) Buffer オブジェクトを配列に一時的に格納し、最終的にそれを大きな Buffer に組み立ててから、出力用の文字列にエンコードします。 バッファはファイル I/O やネットワーク I/O で広く使用されており、そのパフォーマンスは非常に重要であり、そのパフォーマンスは通常の文字列のパフォーマンスよりもはるかに優れています。 文字列変換によるパフォーマンスの低下に加えて、Buffer の使用には、ファイル読み取り時のパフォーマンスにとって重要な highWaterMark 設定があります。 a、highWaterMark 設定は、バッファ メモリの割り当てと使用に一定の影響を与えます。 b. highWaterMark 設定が小さすぎると、システム コールが多すぎる可能性があります。 バッファを使用する場合と使用しない場合 ------ 純粋な JavaScript は Unicode コードをサポートしますが、TCP ストリームまたはファイル ストリームを解決するときは、非 UTF- ストリームを処理する必要があります。 8 文字列、バイナリ、その他の形式の場合は、「バッファ」を使用する必要があります。インスタンスの紹介
var buf = new Buffer("this is text concat test !") ,str = "this is text concat test !" ; console.time("buffer concat test !"); var list = [] ; var len = 100000 * buf.length ; for(var i=0;i<100000;i++){ list.push(buf) ; len += buf.length ; } var s1 = Buffer.concat(list, len).toString() ; console.timeEnd("buffer concat test !") ; console.time("string concat test !") ; var list = [] ; for (var i = 100000; i >= 0; i--) { list.push(str) ; } var s2 = list.join("") ; console.timeEnd("string concat test !") ;
読み込み速度は確実に速くなり、バッファのtoString()操作も必要になります。 したがって、文字列を保存するときは、大きな文字列が文字列に結合された場合でも、バッファより遅くなることはありません。
では、バッファを再び使用する必要があるのはいつですか?他に方法がない場合、非 utf-8 文字列、バイナリ、その他の形式を保存する場合は、これを使用する必要があります。以上がバッファとは何ですか? Bufferの使い方と具体的な利用シーン例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。