Декоратор эталонного времени в C#

#c# #.net #benchmarking

#c# #.net #бенчмаркинг

Вопрос:

Я хотел бы (элегантным способом) использовать какой-нибудь пользовательский атрибут метода, который даст мне это:

Когда я вызываю такой метод foo(), в каком-то атрибуте у меня будет указано прошедшее время (как долго длился вызов метода).

Как я могу это сделать на C #? Размышления?

Заранее благодарю вас. Джеймс

Ответ №1:

C # не предлагает это «из коробки». У вас есть несколько вариантов:

  1. Используйте какой-нибудь внешний профилировщик (я думаю, что в более поздних версиях VS он интегрирован)
  2. Используйте платформу AOP. Например, Postsharp переписывает ваш IL на этапе после сборки, чтобы ввести код prolog / epilog на основе атрибутов.

Комментарии:

1. AOP — это аккуратно. Мне действительно нужно с этим поиграть.

Ответ №2:

Что не так с классом StopWatch? Я регулярно использую его для профилирования общих временных интервалов в критическом коде. Если этого недостаточно, я переключусь на ANTS (или dotTrace).

Ответ №3:

 Action<Action> elegantBenchmark = (body) =>
{
    var startTime = DateTime.Now;
    body();
    Console.WriteLine(DateTime.Now - startTime);
};

elegantBenchmark(DoWork);
  

P.S.
PostSharp выполнит работу так, как вы хотите, чтобы она была выполнена.

Ответ №4:

В C # нет способа перехватить вызов простого старого метода. Вам пришлось бы опубликовать (предварительно) обработать ваш код C # (например, с PostSharp), чтобы действительно достичь этого.

В качестве альтернативы, вы могли бы написать метод бенчмаркинга, который использует лямбда для определения времени фрагмента кода, но это, очевидно, не настоящий декоратор.