12

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

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

每次我记录一些东西时,我也会记录来自 methodBase.Name 和 methodBase.DeclaringType.Name 的类名。

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

我应该使用 this.GetType() 而不是 System.Reflection.MethodBase 还是应该在我的日志中手动记录类/方法名称,例如 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

对于一百万次迭代,这一点也不差尤其是与直接反射相比。方法组被强制转换为 Delegate 类型,您在日志记录中一直保持符号链接。没有愚蠢的魔术弦。

于 2013-06-20T16:54:41.910 回答