次のようなサブシステムがあります。
[read] [decode] [deliver]
Byte --> Undecoded --> Decoded --> Output queue
stream message message
入力はソケット/バイト ストリームです。最初のステップは、メッセージを読むことです。次のステップは、メッセージをデコードすることです (そして、メッセージ オブジェクト内に結果を格納します)。最後のステップは、メッセージを配信することです。
デコード手順を並列化したいのですが、出力順序を入力順序と同じに保つ必要があります。したがって、メッセージ A と B が受信され、メッセージ B のデコードがより高速である場合、A の配信が完了するまで待たなければなりません。
Java で単純な初期実装を作成しましたが、プロファイリングによると、ハンドオーバーの手順 (「ストリーム リーダー」から「デコーダー」まで、および「デコーダー」から出力までの両方) で多くのことを失いました。24 コアのコンピューター (ハイパー スレッディングを含む) でテスト プログラムを実行すると、次のようになります。
- シングルスレッド実装の実行時は 1100 K メッセージ/秒。
- 単純な 12 スレッド実装 (多くのキューを使用) を実行すると、110 K メッセージ/秒。
私の単純な実装は、http://pastebin.com/be1JqZy3で入手できます。これは 200 行を超えるコードなので、並列バージョンをシリアル バージョンよりも 10 倍遅くする方法を本当に知りたい人だけに興味があるでしょう (ヒント: クラス ThreadPoolDecoder を見てください)。
この種の問題を実行するときに使用するパターン/フレームワークを持っている人はいますか?