JavaScript はもともとブラウザー用に設計されたもので、バイナリ データ ストリームを読み取ったり操作したりするメカニズムがありません。 Buffer クラスの導入により、NodeJS はファイル ストリームまたはネットワーク バイナリ ストリームを操作できるようになります。 [ビデオチュートリアルの推奨: node js チュートリアル]
Buffer オブジェクトのメモリ割り当ては、V8 のヒープ メモリ内にはありませんが、割り当てられています。 CレベルのNodeによる メモリアプリケーションはメモリ内の独立した空間として理解できますが、使用時のメモリの割り当てはNodeレベルで完了し、解放もNode内のv8のgc機構によって自動的に制御されます。 Buffer の基本的な操作についてはここでは詳しく説明しませんが、公式ドキュメントが非常に詳しく説明されています。
通常、ネットワーク送信時にはデータをバッファに変換する必要があります。性能比較実験をしてみましょう。
1. 純粋な文字列を使用してクライアントに返す
const http = require('http'); let hello = '' for (var i = 0; i < 10240; i++) { hello += "a"; } console.log(`Hello:${hello.length}`) // hello = Buffer.from(hello); http.createServer((req, res) => { res.writeHead(200); res.end(hello); }).listen(8001);
Use ab -c 200 -t 100
http://127.0.0.1:8001/ コマンドでパフォーマンス テストを実行し、200 の同時クライアントを開始します
文字列を使用すると、QPS は 4019.70 に達し、送信速度は 40491.45KB になります。毎秒。
2. バッファを使用します。文字列を Buffer オブジェクトに変換し、クライアントに送信します。
const http = require('http'); let hello = '' for (var i = 0; i < 10240; i++) { hello += "a"; } console.log(`Hello:${hello.length}`) hello = Buffer.from(hello); http.createServer((req, res) => { res.writeHead(200); res.end(hello); }).listen(8001);
バッファ変換のコメントを解除し、ab -c 200 -t 100
http://127.0.0.1:8001/ テストも使用し、200 の同時クライアントも開始します。
バッファを使用すると、QPS は 7130.05 に達し、転送速度は 71822.74KB/秒になります。
パフォーマンスは元の 177% になり、サーバー リソースが大幅に節約されます。
上記の比較例は「わかりやすいNode JS入門」を参考にしています。
理由は実は非常に単純で、NodeJS では http 送信を行う際に返される型が string
の場合、 string
型パラメータが Buffer に変換されてしまいます。 NodeJS の Stream ストリームを通じて少しずつクライアントに返されます。 Buffer 型を直接返すと、変換処理が行われずに直接返されるため、CPU の再利用率が低下します。ロジックのこの部分は、Node ソース コード #https://github.com/nodejs/node/blob/v10.9.0/lib/_http_outcoming.js#L612
にあります。上記のパフォーマンス比較例では、string
を返す場合、各リクエストは string
をバッファに置き換えて返す必要があります。バッファを直接返す場合、このバッファはメモリに格納されます。各リクエストはメモリ内のバッファを直接返すことができるため、バッファを使用する前後の QPS が大幅に向上します。
したがって、ビジネスコードを記述するときに、一部のリソースを事前にバッファ型 (js、css、その他の静的リソース ファイルなど) に変換し、バッファを直接クライアントに返すことができます。 、一部のファイル転送シナリオでは、追加の変換操作を避けるために、取得されたコンテンツはバッファーに保存され、直接転送されます。
参考:
この記事は https://segmentfault.com/a/1190000016056466
から転載しています。
プログラミング関連の知識について詳しくは、プログラミング教育をご覧ください。 !
以上がNode.jsバッファの使い方の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。