ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法

Nodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法

不言
不言オリジナル
2018-08-18 11:03:462641ブラウズ

この記事の内容は、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个并发客户端

Nodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法

使用字符串,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个并发客户端。

Nodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法

使用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

Nodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法

文字列を使用、QPS は 401 に到達可能9.70、送信レートは40491.45KB毎秒。

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

バッファ変換のコメントを外し、 ab -c 200 -t 100 http://127.0.0.1:8001/Test、200 の同時クライアントも開始します。


1766394733-5b76ed5f7f5dd_articlex. png 🎜🎜🎜🎜🎜バッファを使用すると、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、その他の静的リソースファイルなど)を事前にバッファタイプに変換し、そのバッファをたとえばいくつかのファイルでクライアントに直接返すことができます。転送シナリオでは、取得したコンテンツはバッファとして保存され、追加の変換操作を避けるために直接転送されます。 🎜🎜関連する推奨事項: 🎜🎜🎜NodeJS_node.js の Buffer モジュールの詳細な説明🎜🎜🎜🎜🎜NodeJS の Buffer とは何か、およびその使用方法を例とともに詳細に説明🎜🎜🎜🎜🎜

以上がNodejsのバッファとは何ですか? Nodejsでのバッファクラスの使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。