MethodBase.GetCurrentMethod()性能?

时间:2011-02-03 11:33:03

标签: c# performance reflection methodbase

我编写了一个日志类和一个函数,如下面的代码所示:

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

每次我记录某些内容时,我还会从methodBase.Name和methodBase.DeclaringType.Name中记录类名。

我阅读了以下帖子Using Get CurrentMethod,我注意到这种方法很慢。

我应该使用this.GetType()而不是System.Reflection.MethodBase,或者我应该在我的日志中手动记录类/方法名称,例如记录(“ClassName.MethodName”,“日志消息”?什么是最佳做法?

2 个答案:

答案 0 :(得分:9)

这取决于。

如果您使用this.GetType()方法,您将丢失方法信息,但根据您的链接,您将获得很大的性能提升(显然是1200倍)。

如果你提供一个允许调用者提供字符串的接口(例如Log("ClassName.MethodName", "log message"),你可能会获得更好的性能,但这会使你的API不那么友好(调用开发人员必须提供类名和方法名) )。

答案 1 :(得分:4)

我知道这是一个老问题,但我想我会抛弃一个似乎表现良好且保持符号的简单解决方案

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

对于一百万次迭代, at 并不坏,特别是与直接反射相比。方法组正在转换为Delegate类型,您将一直保持符号链接到日志记录中。没有愚蠢的魔法弦。