C# PostSharp对速度没有影响

C# PostSharp对速度没有影响,c#,.net,performance,postsharp,C#,.net,Performance,Postsharp,我偶然发现PostSharp的性能表现出奇地好。为了评估速度,我编写了一个小程序,它将执行一个函数指定的次数,如果启用PostSharp,它将生成并删除几百个字符串,就在内存中(非固定组合,因此它们不会自动插入)。循环的执行时间非常短(几毫秒) 现在,我无法测量几百万次运行的差异,一次约400亿次迭代的疯狂运行与执行相同调用次数的非PostSharp版本相比仅相差几纳秒。对我来说,这是不可能的。我的考试一定有问题。我的同事对代码进行了同行评审,因此我相当有信心代码能达到我的目的 那么,使用字符串

我偶然发现PostSharp的性能表现出奇地好。为了评估速度,我编写了一个小程序,它将执行一个函数指定的次数,如果启用PostSharp,它将生成并删除几百个字符串,就在内存中(非固定组合,因此它们不会自动插入)。循环的执行时间非常短(几毫秒)

现在,我无法测量几百万次运行的差异,一次约400亿次迭代的疯狂运行与执行相同调用次数的非PostSharp版本相比仅相差几纳秒。对我来说,这是不可能的。我的考试一定有问题。我的同事对代码进行了同行评审,因此我相当有信心代码能达到我的目的

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

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


谢谢。

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


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

我已经做了性能测试。它们发表在

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


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

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

如我所说,字符串不是固定的。它们包括随机数。此外,VS中的调试构建不会优化任何内容。它们在这种情况下非常愚蠢,这就是为什么它们是一致性的好参考。@Alex:也许你应该包括一个测试代码的框架。没有具体细节,我想我和nobugz已经说了尽可能多的话。对于400亿次迭代,几毫秒的运行时间是不可能的,测试之间只有几纳秒的增量也是不可能的。还有一件事——运行整个(n=400亿次)测试需要多长时间?做很多次可能至少需要几分钟的事情;如果它的运行速度比这快,那么它可能不会运行那么多次。需要一个多小时。至于代码,实际上没有太多的示例。调用函数时有一个for循环,在生成随机字符串的函数中有一个for循环(以确保函数不是瞬时的,并且不会在发布版本中得到优化),在生成随机字符串的postsharp属性中有一个for循环。@Alex:您提到如果存在postsharp属性,它生成并删除几百个字符串。超过400亿次迭代,仅此一项就需要一个多小时。我的心理调试器告诉我PostSharp代码永远不会执行,或者可能在测试循环之外执行。你在那里设置了断点吗?请发布一个简短但完整的程序来显示问题,以便其他人可以使用实际的代码和事实,而不是你对它的解释。我确信您的测试有点奇怪,因为PostSharp会向每个方法添加一些代码,除了您要求它添加的实际代码之外,这不太可能对运行时没有影响。