名前付きパイプはソケットIPCよりも高速だと誰もが言っているようです。それらはどれくらい速いですか?双方向通信を行うことができ、非常に柔軟であるため、ソケットを使用したいと思いますが、かなりの量であれば、柔軟性よりも速度を選択します。
ソケットからパイプに変更できるように、ipcメカニズムを慎重に分離して、簡単なパスを最初に作成することをお勧めしますが、まずソケットを使用することをお勧めします。事前に最適化する前に、IPC=パフォーマンスが問題であることを確認してください。
また、IPC速度が原因で問題が発生した場合は、パイプではなく共有メモリへの切り替えを検討する必要があると思います。
転送速度のテストを行いたい場合は、 socat を試してください。これは、あらゆる種類のトンネルを作成できる非常に用途の広いプログラムです。
私はshodanexに同意するつもりです、あなたはまだ問題のないものを最適化しようとしているようです。あなたがknowソケットがボトルネックにならない限り、私はそれらを使用するだけです。
名前付きパイプに誓う多くの人は、(他のすべてが書かれているかどうかに応じて)少し節約できますが、IPC応答よりも多くの時間をブロックに費やすコードになります確かに、ノンブロッキングスキームはこれを助けますが、それらはトリッキーかもしれません。古いコードを現代に持ち込むのに何年も費やしているので、私が見たほとんどの場合、スピードアップはほとんどありません。
ソケットが実際に速度を低下させると本当に考えている場合は、ロックの使用方法に注意して共有メモリを使用してゲートから出てください。繰り返しになりますが、実際には多少の高速化が見られるかもしれませんが、相互排他ロックを待機している部分を無駄にしていることに注意してください。 futex hell (まあ、quite地獄への旅行をもう支持するつもりはありません。経験)。
ポンドはポンドです。ソケットは(ほとんど)常にユーザー空間に行くのに最適な方法ですIPCモノリシックカーネルの下で..そして(通常)デバッグと保守が最も簡単です。
ソケットは必ずしもIP(およびTCPまたはUDP)を意味するわけではないことに注意してください。UNIXソケット(PF_UNIX)を使用することもできます。
多くの場合、数字は気分以上のものを示しています。以下にデータを示します。 パイプvs Unixソケットパフォーマンス(opendmx.net) 。
このベンチマークは、パイプの速度が約12〜15%速いことを示しています。
Shared Memoryソリューションで最良の結果が得られます。
名前付きパイプは、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 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
速度が必要ない場合は、ソケットが最も簡単な方法です!
探しているのが速度である場合、最速のソリューションは名前付きパイプではなく共有メモリです。
ソケットの問題の1つは、バッファをフラッシュする方法がないことです。すべてのデータを収集して40ミリ秒後にフラッシュするNagleアルゴリズムと呼ばれるものがあります。したがって、帯域幅ではなく応答性である場合は、パイプを使用する方がよい場合があります。
ソケットオプションTCP_NODELAYを使用してNagleを無効にできますが、読み取り側は1回の読み取り呼び出しで2つの短いメッセージを受け取ることはありません。
それをテストして、私はこれのどれもなしになって、共有メモリにpthread mutexとセマフォを持つメモリマップベースのキューを実装し、多くのカーネルシステムコールを回避しました(しかし、今日はもはやそれほど遅くありません)。
名前付きパイプとの双方向通信の場合:
名前付きパイプの実装は非常に簡単です。
例えば。標準ファイル入出力ベースの通信(fopen、fprintf、fscanf ...)のおかげで、名前付きパイプを使用してCでプロジェクトを実装しました。
Java(オブジェクトをシリアル化し、オブジェクトを送信していました!)
名前付きパイプには1つの欠点があります。
名前付きパイプとソケットは機能的に同等ではありません。ソケットはより多くの機能を提供します(最初は双方向です)。
どちらがより良いパフォーマンスを発揮するかはわかりませんが、それは問題ではないと強く思います。
Unixドメインソケットは、tcpソケットとほぼ同じことを行いますが、ローカルマシン上でのみ(おそらく)オーバーヘッドが低くなります。
Unixソケットの速度が十分ではなく、大量のデータを転送している場合は、クライアントとサーバー間で共有メモリを使用することを検討してください(セットアップが非常に複雑です)。
UnixとNTの両方に「名前付きパイプ」がありますが、機能セットはまったく異なります。
ZeroMQ [ zmq/0mq ]のような軽量ソリューションを使用できます。非常に使いやすく、ソケットよりも劇的に高速です。