2011-02-03 18 views
8

私は、ログクラスと次のコードのような機能を書かれている:MethodBase.GetCurrentMethod()パフォーマンスですか?

Log(System.Reflection.MethodBase methodBase, string message) 

私はまたmethodBase.NameとmethodBase.DeclaringType.Nameからクラス名をログに何かを記録するたびに。

私は次の投稿Using Get CurrentMethodを読んで、この方法が遅いことに気付きました。

System.Reflection.MethodBaseの代わりにthis.GetType()を使用するか、手動でクラス/メソッド名をログに記録する必要があります。ログ(「ClassName.MethodName」、「メッセージをログ)は?ベストプラクティスは何ですか?

+0

@loannisと同様の質問がここに尋ねられます。リンクをチェックしてください。http://stackoverflow.com/questions/1466740/using-getcurrentmethod-in-supposedly-high-performance-code – RameshVel

+0

danielsからの回答「this.GetType()は、呼び出しごとに2.5 ns必要ですが、MethodBase.GetCurrentMethod() .DeclaringTypeはコール1回につき2490 ns必要なので、約1200倍のスピードアップが得られます。 – RameshVel

+0

@Ramesh:これは、質問にすでにリンクしているのとまったく同じ質問だったことに気が付きましたか? –

答えて

9

それは本当に依存します。

あなたがthis.GetType()アプローチを使用している場合は、メソッド情報を失うことになりますが、あなたは大きなを持っています

呼び出し元が文字列を入力できるようにするインターフェイスを提供している場合(たとえば、Log("ClassName.MethodName", "log message")の方がパフォーマンスは向上しますが、これによりAPIが使いやすくなります呼び出し側の開発者はクラス名とメソッド名を指定する必要があります)

2
Reflection Time: 1692.1692ms 
    Lookup Time: 19.0019ms 

Press Enter to exit 
:私はこれが古い質問ですけど、私はうまく行っているようだシンプルなソリューションを投げるはずと考えたと維持のシンボル

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); 
     } 
    } 

このコードを実行すると、以下の結果を私に与えます

百万回の反復では、特にストレート・アップ反射と比較して、は全くであり、悪くありません。メソッドグループはDelegate型にキャストされ、ロギングの途中でシンボリックリンクが維持されます。馬鹿な魔法の弦。

+1

投稿した正確なコードに基づいて計算を行っていて、実際にログメソッド自体に何も起こっていない場合、デリゲートルートの使用時間が短くなるとは思いません実際に何もしないのですか?あなたは実際に 'Log(Delegate info ...')メソッドに渡すメソッドの名前を得ることができますか? – Zack

+1

@Zackが期待しているように、LogメソッドのNameプロパティにアクセスすると、私の結果は 'Reflection Time:1178,6813ms Lookup Time:482,2953ms'になりましたが、まだ" Lookup " - アプローチはより速い実行につながります。 –

関連する問題