ホームページ > 記事 > ウェブフロントエンド > Nodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法
この記事の内容は、Nodejs のバッファとは何ですか? Nodejs でのバッファー クラスの使用法については、参考にしていただければ幸いです。
JavaScript は元々ブラウザー用に設計されたもので、バイナリ データ ストリームを読み取ったり操作したりするメカニズムがありません。 Buffer クラスの導入により、NodeJS はファイル ストリームまたはネットワーク バイナリ ストリームを操作できるようになります。
Bufferの基本概念
Bufferオブジェクトのメモリ割り当てはV8のヒープメモリ上にはありませんが、NodeはC++レベルでメモリ適用を行っており、一部の空間をメモリ上に別途開放していることが分かります。ですが、使用する際のメモリの割り当てはNodeレベルで完了し、リリースもNode内のv8のgc機構によって自動的に制御されます。 Buffer の基本的な操作については、ここでは詳しく説明しません。公式ドキュメントが非常に詳しく説明されています。
バッファの性能比較
通常、ネットワーク送信時にはデータをバッファに変換する必要があります。性能比較実験をしてみましょう。
1. 純粋な文字列を使用してクライアントに返します
const http = require('http'); let hello = '' for (var i = 0; i { res.writeHead(200); res.end(hello); }).listen(8001);
ab -c 200 -t 100
http://127.0.0.1:8001/ パフォーマンス テストを実行する、200 の同時クライアントを開始ab -c 200 -t 100
http://127.0.0.1:8001/命令来进行性能测试,发起200个并发客户端
使用字符串,QPS可以达到4019.70,传输率为40491.45KB每秒。
2.使用Buffer。将字符串转换为Buffer对象,再发给客户端。
const http = require('http'); let hello = '' for (var i = 0; i { res.writeHead(200); res.end(hello); }).listen(8001);
取消Buffer转换的注释,同样使用ab -c 200 -t 100
http://127.0.0.1:8001/测试,同样发起200个并发客户端。
使用Buffer,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_outgoing.js#L612
在上面性能对比示例中,返回string
时,每次请求都需要将string
文字列を使用、QPS は 401 に到達可能9.70、送信レートは40491.45KB毎秒。
2. バッファーを使用します。文字列を Buffer オブジェクトに変換し、クライアントに送信します。 rrreee
バッファ変換のコメントを外し、ab -c 200 -t 100
http://127.0.0.1:8001/Test、200 の同時クライアントも開始します。 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、その他の静的リソースファイルなど)を事前にバッファタイプに変換し、そのバッファをたとえばいくつかのファイルでクライアントに直接返すことができます。転送シナリオでは、取得したコンテンツはバッファとして保存され、追加の変換操作を避けるために直接転送されます。 🎜🎜関連する推奨事項: 🎜🎜🎜NodeJS_node.js の Buffer モジュールの詳細な説明🎜🎜🎜🎜🎜NodeJS の Buffer とは何か、およびその使用方法を例とともに詳細に説明🎜🎜🎜🎜🎜以上がNodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。