Декоратор времени в C # - PullRequest
2 голосов
/ 18 мая 2011

Я бы хотел (ЭЛЕГАНТНО) использовать некоторый атрибут метода, который даст мне следующее:

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

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

Спасибо заранее. Джеймс

Ответы [ 4 ]

3 голосов
/ 18 мая 2011

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

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

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

1 голос
/ 19 мая 2011
Action<Action> elegantBenchmark = (body) =>
{
    var startTime = DateTime.Now;
    body();
    Console.WriteLine(DateTime.Now - startTime);
};

elegantBenchmark(DoWork);

P.S. PostSharp сделает работу так, как вы хотите.

0 голосов
/ 18 мая 2011

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

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

...