名前付きパイプはソケットIPCより速いと誰もが言うようです。彼らはどれくらい速いですか?ソケットを使用したいのは、双方向通信が可能で非常に柔軟性があるためです。ただし、速度がかなり高い場合は、柔軟性よりも速度を選択します。
名前付きパイプはソケットIPCより速いと誰もが言うようです。彼らはどれくらい速いですか?ソケットを使用したいのは、双方向通信が可能で非常に柔軟性があるためです。ただし、速度がかなり高い場合は、柔軟性よりも速度を選択します。
回答:
共有メモリソリューションで得られる最良の結果。
名前付きパイプは、TCPソケットよりもわずか16%優れています。
結果はIPCベンチマークで得られます。
パイプベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 27367.454 ms
Average duration: 27.319 us
Minimum duration: 5.888 us
Maximum duration: 15763.712 us
Standard deviation: 26.664 us
Message rate: 36539 msg/s
FIFO(名前付きパイプ)ベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 38100.093 ms
Average duration: 38.025 us
Minimum duration: 6.656 us
Maximum duration: 27415.040 us
Standard deviation: 91.614 us
Message rate: 26246 msg/s
Message Queueベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 14723.159 ms
Average duration: 14.675 us
Minimum duration: 3.840 us
Maximum duration: 17437.184 us
Standard deviation: 53.615 us
Message rate: 67920 msg/s
共有メモリのベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 261.650 ms
Average duration: 0.238 us
Minimum duration: 0.000 us
Maximum duration: 10092.032 us
Standard deviation: 22.095 us
Message rate: 3821893 msg/s
TCPソケットのベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 44477.257 ms
Average duration: 44.391 us
Minimum duration: 11.520 us
Maximum duration: 15863.296 us
Standard deviation: 44.905 us
Message rate: 22483 msg/s
Unixドメインソケットのベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 24579.846 ms
Average duration: 24.531 us
Minimum duration: 2.560 us
Maximum duration: 15932.928 us
Standard deviation: 37.854 us
Message rate: 40683 msg/s
ZeroMQベンチマーク:
Message size: 128
Message count: 1000000
Total duration: 64872.327 ms
Average duration: 64.808 us
Minimum duration: 23.552 us
Maximum duration: 16443.392 us
Standard deviation: 133.483 us
Message rate: 15414 msg/s
shodanexに同意します。まだ問題のないものを最適化しようとしているようです。ソケットがボトルネックになることがわかっているのでない限り、私はそれらを使用します。
名前付きパイプを使用して誓う多くの人々は少し節約できます(他のすべてがどのように書かれているかによって異なります)が、IPC応答のブロックに、有用な作業を行うよりも多くの時間を費やすコードになります。確かに、非ブロッキングスキームはこれを助けますが、それらは扱いにくい場合があります。何年もかけて古いコードを現代に持ち込んだことは、私が見たほとんどの場合、スピードアップはほとんどゼロであると言えるでしょう。
ソケットがあなたを遅くすると本当に思っているのなら、ロックの使い方に注意して共有メモリを使ってゲートから出てください。繰り返しになりますが、実際には、わずかな高速化が見つかるかもしれませんが、相互排他ロックを待機している間にその一部が無駄になっていることに注意してください。私は旅行擁護するつもりはないのfutex地獄(まあ、ない非常にあなたの経験に応じて、2015年にはもう地獄を)。
ポンドはポンドで、ソケットは(ほとんど)常にモノリシックカーネルの下でユーザー空間IPCを実現するための最良の方法であり、(通常)デバッグと保守が最も簡単です。
ソケットは必ずしもIP(およびTCPまたはUDP)を意味するわけではないことに注意してください。UNIXソケット(PF_UNIX)を使用することもできます。これにより、127.0.0.1への接続に比べてパフォーマンスが著しく向上します。
しばしば、数値は感じている以上のものを言います、ここにいくつかのデータがあります: パイプvs Unixソケットパフォーマンス(opendmx.net)。
このベンチマークは、パイプの速度が約12〜15%速いという違いを示しています。
名前付きパイプとの双方向通信の場合:
名前付きパイプの実装は非常に簡単です。
たとえば、名前付きパイプを使用してプロジェクトをCに実装しました。これは、標準のファイル入出力ベースの通信(fopen、fprintf、fscanf ...)のおかげで、非常に簡単でクリーンです(それが考慮事項である場合)。
私はそれらをjavaでコーディングしました(オブジェクトをシリアル化して送信していました!)
名前付きパイプには1つの欠点があります。
ソケットの問題の1つは、バッファをフラッシュする方法がないことです。すべてのデータを収集して40ミリ秒後にフラッシュするNagleアルゴリズムと呼ばれるものがあります。したがって、それが帯域幅ではなく応答性である場合は、パイプを使用する方がよいでしょう。
ソケットオプションTCP_NODELAYを使用してNagleを無効にすることはできますが、その場合、読み取り側は1回の読み取り呼び出しで2つの短いメッセージを受け取ることはありません。
だからテストしてみたところ、何もない状態になり、共有メモリにpthread mutexとセマフォを使ってメモリマップベースのキューを実装し、多くのカーネルシステムコールを回避しました(しかし、今日はそれほど遅くありません)。
名前付きパイプとソケットは機能的に同等ではありません。ソケットはより多くの機能を提供します(最初は双方向です)。
どちらが優れているかはわかりませんが、それは問題ではないと私は強く信じています。
Unixドメインソケットはtcpソケットとほぼ同じように機能しますが、ローカルマシン上でのみ(おそらく少し)オーバーヘッドが低くなります。
Unixソケットの速度が十分でなく、大量のデータを転送している場合は、クライアントとサーバーの間で共有メモリを使用することを検討してください(これは設定が非常に複雑です)。
UnixとNTにはどちらも「名前付きパイプ」がありますが、機能セットはまったく異なります。
ZeroMQ [ zmq / 0mq ]のような軽量ソリューションを使用できます。非常に使いやすく、ソケットよりも劇的に高速です。
nanomsg
。とにかく、この素晴らしい場所を歓迎して楽しんで、積極的に貢献するメンバーになってください。
pipe(2)
(ermkfifo(3)
、?)が勝者かもしれませんが、試すまでわかりません。