methodbase.getCurrentMethod()パフォーマンス?
-
28-10-2019 - |
質問
次のコードのように、ログクラスと関数を書きました。
Log(System.Reflection.MethodBase methodBase, string message)
何かを記録するたびに、methodbase.nameおよびmethodbase.declaringtype.nameからクラス名をログも記録します。
次の投稿を読みました get currentMethodを使用します そして、この方法が遅いことに気付きました。
system.Reflection.MethodBaseの代わりにthis.getType()を使用する必要がありますか、またはログ( "classname.methodname"、 "log message)にログにクラス/メソッド名を手動でログに記録する必要がありますか?ベストプラクティスは何ですか?
解決
それは本当に依存します。
使用する場合 this.GetType()
アプローチメソッド情報が失われますが、パフォーマンスが大きくなります(リンクに応じて、明らかに1200の係数)。
発信者に文字列を供給できるインターフェイスを提供する場合(例: Log("ClassName.MethodName", "log message")
, 、おそらくさらに良いパフォーマンスを得るでしょうが、これによりAPIは友好的ではなくなります(呼び出し開発者はクラス名とメソッド名を提供する必要があります)。
他のヒント
私はこれが古い質問であることを知っていますが、私はうまく機能し、シンボルを維持するように見える簡単な解決策を捨てると思いました
static void Main(string[] args)
{
int loopCount = 1000000; // 1,000,000 (one million) iterations
var timer = new Timer();
timer.Restart();
for (int i = 0; i < loopCount; i++)
Log(MethodBase.GetCurrentMethod(), "whee");
TimeSpan reflectionRunTime = timer.CalculateTime();
timer.Restart();
for (int i = 0; i < loopCount; i++)
Log((Action<string[]>)Main, "whee");
TimeSpan lookupRunTime = timer.CalculateTime();
Console.WriteLine("Reflection Time: {0}ms", reflectionRunTime.TotalMilliseconds);
Console.WriteLine(" Lookup Time: {0}ms", lookupRunTime.TotalMilliseconds);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
public static void Log(Delegate info, string message)
{
// do stuff
}
public static void Log(MethodBase info, string message)
{
// do stuff
}
public class Timer
{
private DateTime _startTime;
public void Restart()
{
_startTime = DateTime.Now;
}
public TimeSpan CalculateTime()
{
return DateTime.Now.Subtract(_startTime);
}
}
このコードを実行すると、次の結果が得られます。
Reflection Time: 1692.1692ms
Lookup Time: 19.0019ms
Press Enter to exit
100万回の反復については、それは悪くありません まったく, 、特にまっすぐな反射と比較して。メソッドグループはデリゲートタイプにキャストされており、ロギングに象徴的なリンクを維持します。間抜けな魔法の弦はありません。