#c# #.net #benchmarking
#c# #.net #бенчмаркинг
Вопрос:
Я хотел бы (элегантным способом) использовать какой-нибудь пользовательский атрибут метода, который даст мне это:
Когда я вызываю такой метод foo(), в каком-то атрибуте у меня будет указано прошедшее время (как долго длился вызов метода).
Как я могу это сделать на C #? Размышления?
Заранее благодарю вас. Джеймс
Ответ №1:
C # не предлагает это «из коробки». У вас есть несколько вариантов:
- Используйте какой-нибудь внешний профилировщик (я думаю, что в более поздних версиях VS он интегрирован)
- Используйте платформу 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), чтобы действительно достичь этого.
В качестве альтернативы, вы могли бы написать метод бенчмаркинга, который использует лямбда для определения времени фрагмента кода, но это, очевидно, не настоящий декоратор.