0

メッセージをソケット経由で送信することと併せて、メッセージを 2 つのファイルに記録するアプリケーションがあります。1 つのファイルはバイナリ表現を取得し、もう 1 つのファイルは人間が判読できる同等の表現を取得します。メッセージ クラスには、人間が読めるバージョンのメッセージをストリームに出力する関数があります。バイナリ表現は、メッセージ クラスで byte[] として使用できます。

送信メッセージ レートを最大化したいので、ロギング アクションはできるだけ迅速に行う必要があると感じています。

考えられるアプローチの 1 つは、単純にタスクを作成して各ログ アクションを実行し、メッセージ インスタンスへの参照を各タスクに渡すことです。このアプローチの問題点は、メッセージ インスタンスがプールされたオブジェクトであり、ある時点でプールに返さなければならないことです。複数のスレッドがメッセージ オブジェクトへの参照を保持しているため、メッセージ オブジェクトを最後に使用したスレッドが実際にメッセージ オブジェクトを返すように調整することは困難です。さらに、メッセージを送信する必要があるたびにタスク (または任意のオブジェクト) を作成したくありません。

Write() の最速の実装には、次の 2 つの特徴があると思います。 1. メッセージを送信しているスレッドとは別のスレッドで、ファイルにデータを書き込む作業を処理します。2. 追加のオブジェクトを割り当てません (したがって、GC のために一時停止する可能性はありません)。新しいメモリの割り当ては望ましくないため、Write() メソッドは、書き込み用のメッセージを受け入れるのに十分なスペースができるまでブロックできます。

ここで CircularBuffer/CircularStream のようなものを使用することを検討しています: http://circularbuffer.codeplex.com/ (ただし、バッファがいっぱいの場合、この実装はブロックされません)

あなたの考えは何ですか?

4

0 に答える 0