log4net の使用とSystem.Diagnostics.Trace
ロギングの違いを調査しており、観察したパフォーマンスの違いに興味があります。
いくつかのシナリオで両方のロギング方法のパフォーマンスを比較するテスト アプリケーションを作成しましたが、log4net はTrace
クラスよりも大幅に遅いことがわかりました。たとえば、文字列フォーマットなしで 1,000 件のメッセージをログに記録するシナリオでは、1,000 回の試行での log4net の平均実行時間は 9.00 ミリ秒です。 Trace
平均 1.13ms で実行されます。多くのテスト ケースでは、log4net の実行時間に比較的大きなばらつきがあります。外れ値の長い実行の周期的な性質は、GC 干渉を示唆しているようです。CLR Profiler をいじってみると、生成された大量のオブジェクトに対して大量のコレクションが存在することが確認log4net.Core.LoggingEvent
されます (公平を期すために、大量のオブジェクトも生成されているように見えますが、log4net のように大きな分散は表示されません。 )Trace
Char[]
ここで私が心に留めていることの 1 つは、log4net は よりも約 9 倍遅いように見えますがTrace
、その差は 1,000 回の反復で 8 ミリ秒であることです。これは正確には重大なパフォーマンスの低下ではありません。それでも、予想される使用例のいくつかは、何十万回もログを記録するメソッドを呼び出す可能性があり、これらの数値は私の高速マシンからのものです。ユーザーの構成のより典型的な低速のマシンでは、違いは 170 ミリ秒から 11 ミリ秒であり、これは少し憂慮すべきことです。
このパフォーマンスは log4net の典型的なものですか、それとも log4net のパフォーマンスを大幅に向上させることができる落とし穴がありますか?
(注: 文字列の書式設定によって実行時間が変わる可能性があることは認識しています。リンゴとリンゴを比較しようとしていますが、書式設定のないテスト ケースと書式設定のあるテスト ケースがあります。文字列の書式設定が使用されているかどうかにかかわらず、log4net は比例して遅くなります。 )
これまでの話:
- Robert Gould がこの質問に対する最良の答えを持っています。log4net のパフォーマンスが
Trace
クラスよりもはるかに遅いことが一般的であるかどうかに主に興味がありました。 - Alex Shnayder の回答は興味深い情報ですが、実際には質問の範囲には該当しません。このロギングを導入する目的の半分は、稼働中のシステムでの論理的問題とパフォーマンス上の問題の両方のデバッグを支援することです。当社の顧客は、高価で大規模なハードウェア構成なしでは再現が難しいことが多い多くの風変わりなシナリオに当社の製品を入れています。私の主な懸念は、「ログを記録しない」と「ログを記録する」の間の大きなタイミングの違いが、バグが発生しないような方法でシステムに影響を与える可能性があることです。結局、パフォーマンス低下の規模は大きいですが、程度は小さいので、問題ないことを願っています。