3

最近、いくつかの node.js ネイティブ機能のベンチマークを試みたところ、理解できない不気味な結果が見つかりました。これは、私がベンチマークし、結果をベンチマークした簡単なコードです。

http://pastebin.com/0eeBGSV9

200 の同時実行で 100,000 件のリクエストに対して、1 秒あたり 8553 件のリクエストを正常に処理したことがわかります。その後、友人から、この場合は async を使用しないように指示されました。このループはノードのイベント ループを妨げるほど大きくないため、コードをリファクタリングして for ループを使用すると、ベンチマークの結果がさらに増加し​​ました高い:

http://pastebin.com/0jgRPNEC

ここでは、1 秒あたり 9174 のリクエストがあります。きちんとした。(不思議なことに、反復回数を 10k に変更した場合でも、for ループ バージョンは async バージョンより一貫して高速でした)。

しかし、私の友人は、ループが終了した後にすべてのデータをダンプする代わりに、ストリーミングを使用してこの結果をさらにプッシュできるかどうか迷っていました。ここでも、データ出力を処理するために res.write を使用するようにコードをリファクタリングしました。

http://pastebin.com/wM0x5nh9

aaaaand 1 秒あたり 2860 のリクエストがあります。ここで何が起こったのですか?ストリームの書き込みが遅いのはなぜですか? 私のコードに何らかのエラーがありますか、それともノードが実際にストリームを処理する方法ですか?

apt インストールのデフォルト設定では、ubuntu のノード バージョンは 0.10.25 です。

また、最初に JXCore と HHVM (ノード コードの async.js バージョンを使用) に対して同じコードをテストしました。結果はhttp://pastebin.com/6tuYGhYGで、ノード クラスターが最新の jxcore 2.3 よりも高速であるという興味深い結果が得られました。 .2.

どんな批評でも大歓迎です。

編集: @Mscdex、res.write() の呼び出しが問題だったのではないかと思ったので、データを res で消費するために作成された新しいストリームにプッシュする方法を変更しました。私は素朴に、おそらくこの方法のノードが何らかの方法で出力バッファリングを最適化し、効果的な方法でデータをストリーミングできると信じていました。このソリューションも機能しましたが、以前よりもさらに遅くなりました。

http://pastebin.com/erF6YKS5

4

1 に答える 1

1

私の推測では、多くの個別のシステムコールを持つことに伴うオーバーヘッドになりますwrite()

ノード v0.12+ では、"コーキング" 機能が追加され、好きなだけ実行できるようres.write()になりましたが、ストリームをコークおよびアンコークして、これらすべての書き込みが 1 つのシステムコールのみになるようにすることができwrite()ます。これは基本的に、出力の連結で現在行っていることですが、コーキングがそれを行います。ノード コアの一部の場所では、このコルク機能がバックグラウンドで自動的に使用される場合もあるため、良好なパフォーマンスを得るために明示的にコルク/アンコルクする必要はありません。

于 2014-09-11T20:02:29.313 に答える