2014-01-08 13 views
5

同期ログは、ログメッセージをファイルに書き込んだ後、プログラムの実行を続行することがわかっています。非同期ロガーはログメッセージをキューに入れ、別のスレッドに書き込みます。私は私のプロジェクトでLog4CPlusを実装し始めており、いくつかのことが私の頭に浮かんだ。非同期ロガーはパフォーマンスに本当に役立ちますか?

LogObjectをさらに初期化することはできません。これは、より多くのファイルハンドルを開くためです。私たちはそれを必要としないためです。 (私は、UploadLogObj、DownloadLogOb、WebReqLogObj、AuthLogObjなどのフィーチャーベースのロギングオブジェクトを使用する必要があることを知っています)。 Logオブジェクトを追加するたびにログスレッドが増える可能性があります。

私は単一ログオブジェクトを使用し、複数のスレッドからログメッセージをプッシュすると、メッセージキューへの書き込みを防止するためにいくつかのmutexロックが必要であると思います。私の質問は、このミューテックスのロックがプロセスを遅くしないでしょう、それはパフォーマンスの問題を作成しません..?

私はちょうど非同期ロガーがどのように動作するのだろうか、私はコードを調べることができます、それは一つの方法です。しかし、答えが多くの人々に啓発されることを願っています。

+0

'boost :: lockfree :: queue'のように、ロックフリーのキューを使うことができます。 – Zeta

+1

**非同期ロガーは、別のスレッドで** IOタスク**を行うために行われます。 – Jarod42

答えて

1

はい、ミューテックスは処理を少し遅くしますが、複数のスレッドから同じ送り先にログを記録している場合は、別のスレッドの行を混在させたくないので、アップ。最後に

は、それは、ない場合を同期させるためにを決定する問題です。非同期ロギングでは、これは、ロギングされるオブジェクトがロギングスレッドのキューにプッシュされたときに発生します。同期イベントの場合、おそらくその行が書き込まれます(実装にもよるが)。

最初のケースでは、ミューテックス中にディスクフラッシュが発生しないため、ミューテックス内部で費やされる時間はずっと短く予測可能です。これは、の方が、のパフォーマンスが低下していないことと、2番目の場合よりスケーリングが優れていることを意味します(実際のデータの書き込みに費やさなかった時間、他のスレッドが処理しているためです)。

とにかくmutexのために競合するスレッドがたくさんある場合は問題ありません。私は以前のリアルタイムシステムに非同期ロガーを書き込んで使用する機会がありましたが、シンクロナイズの問題が発生するずっと前にディスク帯域幅に関する問題に遭遇しました。

非同期ロギングの欠点は、メモリ関連です。ロギングするデータを渡す必要があるため、不必要な割り当て/割り当て解除には注意が必要です。

関連する問題