C#中的时间基准装饰器

时间:2011-05-18 18:09:23

标签: c# .net benchmarking

我希望(以ELEGANT的方式)使用一些自定义方法属性,这将给我这个:

当我调用这样一个方法foo()时,在某个属性中我将有经过的时间(方法调用持续多长时间)。

我怎样才能在C#中做到这一点?反射?

提前谢谢你。 詹姆斯

4 个答案:

答案 0 :(得分:3)

C#不提供开箱即用的功能。你有几个选择:

  1. 使用一些外部探查器(我认为VS的更高版本有一个集成)
  2. 使用AOP框架。例如,Postsharp在后构建步骤中重写您的IL,以根据属性引入prolog / epilog代码。

答案 1 :(得分:2)

StopWatch类出了什么问题?我经常使用它来分析关键代码中的一般时序。如果这还不够,我会切换到ANTS(或dotTrace)。

答案 2 :(得分:1)

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

elegantBenchmark(DoWork);

P.S。 PostSharp将按照您的要求完成工作。

答案 3 :(得分:0)

无法在C#中拦截普通的旧方法调用。您必须发布(预)处理您的C#代码(如使用PostSharp)才能真正实现此目的。

或者,您可以编写一个基准测试方法,该方法使用lambda来计算一大块代码,但这显然不是真正的装饰器。