MethodBase.GetCurrentMethod () Производительность? - PullRequest
9 голосов
/ 03 февраля 2011

Я написал класс журнала и функцию, как показано в следующем коде:

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

Каждый раз, когда я что-то регистрирую, я также записываю имя класса из methodBase.Name и methodBase.DeclaringType.Name.

Я прочитал следующий пост Использование Get CurrentMethod и заметил, что этот метод медленный.

Должен ли я использовать this.GetType () вместо System.Reflection.MethodBase или я должен вручную зарегистрировать имя класса / метода в моем журнале, например, Журнал ("ClassName.MethodName", "сообщение журнала)? Какова лучшая практика?

Ответы [ 2 ]

9 голосов
/ 03 февраля 2011

Это действительно зависит.

Если вы используете подход this.GetType(), вы потеряете информацию о методе, но у вас будет большой прирост производительности (очевидно, в 1200 раз, согласно вашей ссылке).

Если выпредложить интерфейс, который позволяет вызывающей стороне предоставлять строки (например, Log("ClassName.MethodName", "log message"), вы, вероятно, получите еще лучшую производительность, но это делает ваш API менее дружественным (вызывающий разработчик должен предоставить имя класса и имя метода).

5 голосов
/ 20 июня 2013

Я знаю, что это старый вопрос, но я решил выбросить простое решение, которое, кажется, работает хорошо и поддерживает символы

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, вы поддерживаете символическую ссылку в журнале. Никаких глупых волшебных струн.

...