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 の同時クライアントを開始します
文字列を使用すると、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

この記事では、NodeJS V8 エンジンのメモリとガベージ コレクター (GC) について詳しく説明します。

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

ノード用の Docker イメージの選択は些細なことのように思えるかもしれませんが、イメージのサイズと潜在的な脆弱性は、CI/CD プロセスとセキュリティに大きな影響を与える可能性があります。では、最適な Node.js Docker イメージを選択するにはどうすればよいでしょうか?

Node 19 が正式リリースされましたので、この記事では Node.js 19 の 6 つの主要な機能について詳しく説明します。

Node.js はどのように GC (ガベージ コレクション) を行うのでしょうか?次の記事で詳しく説明します。

ノードが npm コマンドを使用できない理由は、環境変数が正しく設定されていないためです。解決策は次のとおりです: 1. 「システムのプロパティ」を開きます; 2. 「環境変数」->「システム変数」を見つけて、環境を編集します。変数; 3.nodejs フォルダーの場所を見つけます; 4.「OK」をクリックします。

イベント ループは Node.js の基本的な部分であり、メイン スレッドがブロックされていないことを確認することで非同期プログラミングが可能になります。イベント ループを理解することは、効率的なアプリケーションを構築するために重要です。次の記事では、Node のイベント ループについて詳しく説明します。お役に立てれば幸いです。
