PostSharp对速度没有影响

时间:2010-01-19 00:44:08

标签: c# .net performance postsharp

我偶然发现PostSharp的性能表现不可思议。为了评估速度,我编写了一个小程序,它将执行一个指定次数的函数,如果启用PostSharp,它将生成并删除几百个字符串,仅在内存中(非固定组合,因此它们不是自动的 - 实习)。循环在非平凡(几毫秒)的时间内执行。

现在,我无法衡量几百万次运行的差异,而且大约400亿次迭代的疯狂运行相当于只有几纳秒的差异,而非PostSharp版本执行相同数量的调用。对我来说,这是不可能的。我的测试肯定有问题。我让我的同事对代码进行了同行评审,所以我相信代码可以实现我的目的。

那么,使用字符串生成(预期用途中的预期用途)作为基准测试的慢速运行模拟是否有问题?

或者,是否有其他人执行(或知道)PostSharp的运行时性能分析?

谢谢。

3 个答案:

答案 0 :(得分:1)

在3 GHz处理器上,单独400亿个时钟周期需要13秒 - 而且我真诚地怀疑单次迭代只需要一个时钟周期。你的测试肯定有问题。

有些东西可能会被优化掉 - 也许它会看到你一遍又一遍地做同样的事情并决定不去做(第一次除外)。在进行性能分析时,您需要确保随机化数据。

答案 1 :(得分:1)

我做过性能测试。它们发表在PostSharp Blog

如果某些方面不使用以下功能,则可以具有与手写代码相同的性能:反射,访问方法参数,访问方法实例。由于PostSharp发出MSIL指令,因此生成的代码可以由JIT编译器内联。

在其他答案中提醒,请确保(1)确实调用了PostSharp(在生成的程序集上使用Reflector)和(2)正确使用秒表。如果您正在比较单个测试的平均时间,那么PostSharp和手写代码之间的差异只有几纳秒是正常的(假设您没有使用昂贵的功能)。

-gael

答案 2 :(得分:0)

您是否可以更改测试,以便在下一次迭代中使用生成的字符串(写入控制台的字符串长度)或类似的东西? 也许编译器以这样的方式优化你的程序:postharp-function根本不执行,或者异步调用或在另一个cpu上执行,因为没有理由与其他迭代同步。如果你更紧密地链接它,这可能会迫使编译器同步动作。