多くの開発者、特に本番環境でNode.jsを使用していない開発者は、Node.jsがPHP、Python、Rubyなどの他のインタープリタード言語よりも高速であると信じているようです。
これらの主張は次のとおりです。
私は確かに最初の主張を信じることができますが、これを示す十分なベンチマークを見つけることができません。 2番目の主張は根拠がないか、少なくとも絶対的すぎるようです。
そのような主張を正当化するNode.JSとV8の特徴は何ですか?
2番目のクレームを見てみましょう。
JavaScriptリアクターパターンは、マルチスレッドアプリケーションよりも並行性を常に適切に処理します。
この主張に対処するために、スケーラビリティはNode.JSの背後にある主要な動機の1つであるため、このコンテキストでの同時実行性はスケーラビリティに等しいと仮定します。区別は微妙ですが重要です。アプリケーションをより適切にスケーリングさせる方法はたくさんあります。並行性は1つの方法ですが、他にもあります。 NodeJSがreactorパターンを実装していると仮定しますが、ここでは詳しく説明しません。
スケーラビリティとは、「できるだけ多くの同時リクエストを処理する機能」を意味します。 node.jsがこれを行う方法は、イベントループを提供することです。イベントループはクライアントからの要求を受け入れ、すぐにそれを「その他のメカニズム」に渡して処理します。次に、制御を呼び出し元に戻します。この非同期アプローチにより、node.jsは特定の時間枠で多くのリクエストを受け入れることができ、他のより多くの同期戦略とは異なり、呼び出し元は続行する前に結果を待つ必要があります。イベントループが要求する処理量は非常に少ないため、ほとんどの場合、新しい要求を受け入れる準備ができています(またはほとんど準備ができています)。
引き渡されたリクエストはどうなりますか?まあ、私たちの議論の目的のために、それは実装の詳細です。与えられたリクエストはそれ自身のスレッドに入れられるか、または他のタスクを含むスレッドでキューに入れられます。 Windowsサービスに渡すことも、フルフィルメントのために他のシステムに送信することもできます。
考慮すべき重要なことは、リクエストのacceptanceを可能な限り短時間で実行することによってイベントループが提供するスケーラビリティです。これは、リクエストごとに個別のスレッドを必要としません。本当に必要なのは2つのスレッド(イベントループを実行するスレッドと、要求を処理するスレッド)だけです。
当然のことながら、妥当な期間内にリクエストを実行したい場合は、前に述べた実装の詳細に馬力を投入する必要があります。無料の昼食はありません。ただし、これは、サービスへの要求が迅速に受け入れられることを確認することによって生じるスケーラビリティとは異なる実際的な問題であり、たとえそれらの要求の結果の取得が後で延期されるとしてもです。
したがって、「reactorパターンは並行性を複数のスレッドよりも適切に処理する」などと誰かが言うとき、それらは少し不正確です。一般的に、彼らは非同期技術をマルチスレッドと比較しています(非同期プログラミングは必ずしも新しいスレッドを必要としない)。私がそれを言う方法は:
イベントループを使用することで、要求の受け入れを抽象化して要求の実行から分離できるため、追加のスレッドの不要なオーバーヘッドを招くことなくスケーラビリティを向上できます。
Node.jsの仕組みの簡単な紹介
node.jsイベントループについて
Reactor:非同期イベントのハンドルを逆多重化およびディスパッチするためのオブジェクト動作パターン
Js-scryptとCryptSharpを使用してクライアントサイドとサーバーサイドの両方にSCryptライブラリを実装しましたが、その結果は衝撃的でした。
クロムを使用すると、実行時間は.net実装の2倍以上速くなりました。
これらのパフォーマンス結果を観察するまで、V8エンジンにそれほど注意を払ったことはありませんでしたが、今では、V8で実行するJavaScriptに非常に好意的です。
マルチスレッドについては、JSはシングルスレッドで非ブロッキングであるため、デフォルトではコードを非同期で記述する必要があります。単一の処理コアでは、JavaScriptは基本的にコードの実行を可能な限りプロセッサ効率の良いものにしますが、サーバーサイドのコードはスレッドを消費し、他のことが起こっている間待機します。ですから、やるべき仕事があり、コアが仕事をしていない状況があります。
多くのコアを備えた適切に作成されたマルチスレッドコード、およびそれらをすべてビジー状態に保つのに十分な作業の場合、jsの非ブロッキングシングルスレッドコードは競合できない可能性があります。たとえば、スーパーコンピュータで宇宙をシミュレートする場合。
ただし、それはNode.jsの目的ではありません。サーバーコードの大部分はマルチスレッドに最適化されておらず、必要もないため、非ブロッキングが優先されます。