CreatePipe() Win32 API 呼び出しを使用して双方向の匿名パイプを作成できるため、入出力のパイピングだけが方法ではありません。他のプロセスに与えることができる新しいファイルハンドルを取得するだけです。
匿名パイプは共有メモリに基づいていますが、(ReadFileEx、ReadFileWrite による) 非同期操作はサポートしていません。したがって、パフォーマンスの問題 (欠点) は、1) 同期操作、2) メモリのコピー、3) プロセス間同期です。一般に、「生の」共有メモリ (実際のバッキング ファイルのないメモリ マップ ファイル) と名前付きパイプは高速で、ソケットとウィンドウ メッセージは (匿名パイプより) 低速です。
匿名パイプで I/O Completion Ports (IOCP) を使用することはできません。代わりに、パイプを「ポーリング」する必要があり、余分なコンテキスト スイッチが発生します。データをシリアル化するだけでなく、共有メモリに直接書き込むことができないため、シリアル化されたデータをメモリ内にコピーする必要があります。1 つのプロセスも別のプロセスを待機する必要があります。これは、他のプロセスがプロセス間同期プリミティブを通知する必要があることを意味します。パフォーマンスは、メッセージのサイズ (送信されたデータ量に対する読み取り/書き込み呼び出しの比率) に大きく依存します。これは、読み取り/書き込みごとに、プロセスがコンテキスト スイッチを作成し、場合によってはスピン/スリープする必要があるためです。
「生の」共有メモリを除くすべてのメソッドは、メモリのコピーとある種のプロセス間シグナル伝達 (同期) を必要とするため、匿名パイプの主な欠点は同期操作です。CPU がほとんどの時間をコンテキスト スイッチの実行に費やしている場合、大量のメッセージを送信すると上限に達します。
IOCP を使用して非同期通知を処理するワーカー スレッドを持つことができ、1 回の呼び出しで複数のメッセージを受信することもできるため、パフォーマンスの面では名前付きパイプの方が優れているため、API のオーバーヘッドが削減されます。独自のコンポーネントを作成する場合は、パイプに名前を付けるという余分な問題が発生するだけの価値があります (さらに、ネットワークを介して接続することもできます)。それ以降の Windows バージョンでは、IOCP もサポートするローカル ソケット用の特別なルーティングが実装されています。
最も速い方法は、共有メモリを直接使用することですが、プロセス間の同期を自分で処理する必要があります。ロックフリー パイプを自分で実装することは可能ですが、常にデータを送信していない場合でも、同期プリミティブを使用してリッスン プロセスに通知/起動する必要があります。
また、ファイルを使用しても、ディスク速度によって制限されるわけではないことに注意してください。メモリ マップされたファイルを使用でき、通常のファイルでもキャッシュ マネージャーが読み取り/書き込みを処理します。他のメソッド (RPC、クリップボードなど) は、これらの「標準」メソッドに基づいています。つまり、プロトコルのレイヤーを追加するだけで、プログラミング環境により簡単に/より便利に、またはより適したものになることを意味します (ただし、速くなりません)。