ホームページ  >  記事  >  ウェブフロントエンド  >  Node.jsバッファの使い方の詳しい説明

Node.jsバッファの使い方の詳しい説明

青灯夜游
青灯夜游転載
2020-08-29 10:23:542133ブラウズ

Node.jsバッファの使い方の詳しい説明

JavaScript はもともとブラウザー用に設計されたもので、バイナリ データ ストリームを読み取ったり操作したりするメカニズムがありません。 Buffer クラスの導入により、NodeJS はファイル ストリームまたはネットワーク バイナリ ストリームを操作できるようになります。 [ビデオチュートリアルの推奨: node js チュートリアル]

Buffer の基本概念

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 の同時クライアントを開始します

Node.jsバッファの使い方の詳しい説明

文字列を使用すると、QPS は 4019.70 に達し、送信速度は 40491.45KB になります。毎秒。

2. バッファを使用します。文字列を Buffer オブジェクトに変換し、クライアントに送信します。

const http = require(&#39;http&#39;);

let hello = &#39;&#39;
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 の同時クライアントも開始します。

Node.jsバッファの使い方の詳しい説明

バッファを使用すると、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 サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。