12

次のコードのように、ログクラスと関数を記述しました。

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

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

Get CurrentMethodを使用して次の投稿を読みましたが、このメソッドが遅いことに気付きました。

System.Reflection.MethodBaseの代わりにthis.GetType()を使用する必要がありますか、それともLog( "ClassName.MethodName"、 "log message)などのクラス/メソッド名を手動でログに記録する必要がありますか?ベストプラクティスは何ですか?

4

2 に答える 2

10

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

このアプローチを使用するthis.GetType()と、メソッド情報が失われますが、パフォーマンスが大幅に向上します(リンクによると、明らかに1200倍)。

呼び出し元が文字列を提供できるインターフェイスを提供する場合(たとえばLog("ClassName.MethodName", "log message")、パフォーマンスはさらに向上しますが、APIの使い勝手が悪くなります(呼び出し元の開発者はクラス名とメソッド名を提供する必要があります)。

于 2011-02-03T12:46:13.790 に答える
6

これは古い質問だと思いますが、うまく機能し、記号を維持しているように見える単純な解決策を捨てると思いました

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万回の反復では、特に真っ直ぐな反射と比較して、それはまったく悪いことではありません。メソッドグループはデリゲートタイプにキャストされており、ロギングに至るまでシンボリックリンクを維持します。間抜けなマジックストリングはありません。

于 2013-06-20T16:54:41.910 に答える