2011-12-02 7 views
5

私はhttpリクエストを送信するのにnode.jsを使います。私はどれくらい時間がかかったかを測定する必要があります。node.jsでhttpリクエスト時間を測定します

start = getTime() 
http.send(function(data) {end=getTime()}) 

私は、HTTP応答のコールバック内でgetTimeを呼び出した場合、応答が原因キュー内の他のイベントに戻ってcamesたときに私のコールバックがすぐに呼び出されていないおそれがあります。多分別のスレッドが私の前に注目を集めているので、私はこのタスクのために通常のJavaまたはC#同期コードを使用すると、そのようなリスクも存在します。

start = getTime() 
http.send() 
end=getTime() 

方法のNode.jsを行いますが、他の(同期)プラットフォームと比較する - それは良い指標良くも悪くも私のチャンスを作るのですか?

+0

低レベル(C++)のフックをイベントループに直接入れないと、 – Raynos

+0

はhttpモジュールを実装する必要があるのですか、または使用できる拡張性のメカニズムがいくつかありますか? –

+4

生のtcpパケットが戻ったときに_exactly_を知りたいということです。あなたのhttpハンドラが呼び出されるのを待ってください。この2つの間にはわずかな遅延しかありません(ネットワークのトラフィック時間と比較してわずかな量です)。 – Raynos

答えて

1

偉大な観測!

論:

あなたはマイクロベンチマークを実行している場合、潜在的な測定をゆがめることができます考慮事項の数が存在する:一緒に発射する準備ができているイベントループ内

  1. その他のイベントhttpを問題にして送信し、送信がチャンスを得る前に順次実行される - ノード固有。

  2. 送信操作の範囲内でいつでも発生する可能性のあるスレッド/プロセスの切り替え - 汎用です。

  3. カーネルのI/Oバッファの容量が制限されていると、OS /ワークロード/システムのロードに固有の遅延が発生します。

  4. システムの収集に要した遅延時間 - 言語/ランタイム固有。

  5. データのチャンク/バッファリング:ソケット[http実装]に固有です。

実践:Javaの/ C#の専用のスレッドがこの問題を持っていないながら

ノエは、(1)に苦しんでいます。しかし、ノードがイベントドリブンの非ブロッキングI/Oモデルを実装するので、他のイベントはブロッキング効果を引き起こさず、むしろイベントキューに配置されます。準備ができているものだけが起動され、それらのために発生する待ち時間は、実行する必要のあるI/O作業の量と、関連するコールバックで実行されるCPUバインドされたアクションの関数になります。これらは、項目(2)〜(5)のより目に見える影響のために、実際には無視できる程度であり、比較では均等になるであろう。さらに、書き込みは一般的にノンブロッキングであるため、次のループの繰り返しが実行されるのを待たずに実行されます。最後に、書き込みが実行されると、コールバックがインラインで逐次的に発行され、その間に別のイベントが発生することはありません。

要するに、I/Oをブロックする専用のJavaスレッドをノードコードと比較すると、Javaの測定値は良好ですが、大規模なアプリケーションでは、スレッドコンテキスト切り替えの労力がこの利得を相殺し、ノードパフォーマンスが際立ちます。

これが役に立ちます。

関連する問題