我在PostSharp中偶然发现了一种不可能的良好的性能行为。为了评估速度,我编写了一个小程序,它将执行一个指定次数的函数,如果启用PostSharp,它将生成和删除几百个字符串,就在内存中(非固定的组合,因此它们不是自动的)。循环在非平凡(几毫秒)的时间内执行。
现在,我无法测量几百万次运行中的差异,一个大约400亿次迭代的疯狂运行相当于几纳秒与非PostSharp版本执行相同数量调用的差异。对我来说,这是不可能的。我的考试肯定有什么问题。我的同事对代码进行了同行评审,所以我很有信心代码能按照我的意愿完成。
那么,使用字符串生成(这是预期的应用程序中的使用)作为基准测试的慢速运行模拟有什么问题吗?
或者,其他人是否执行了(或知道)PostSharp的运行时性能分析?
谢谢。
发布于 2010-01-19 00:49:05
在一个3 GHz处理器上,光是400亿个时钟周期就需要13秒--我很怀疑一次迭代只需要一个时钟周期。你的测试肯定有问题。
有些东西可能会被优化掉--也许它会让你一次又一次地做同样的事情,并且决定根本不去做(除了第一次)。在进行perf分析时,您需要确保将数据随机化。
发布于 2010-01-19 07:19:40
我做过性能测试。它们发表在PostSharp博客上
如果不使用反射、访问方法参数、访问方法实例等特性,某些方面可以具有与手写代码相同的性能。由于JIT发出了PostSharp指令,所以生成的代码可以由JIT编译器内联。
正如在其他答案中提醒的那样,请确保(1)确实调用了PostSharp (在结果程序集上使用反射器)和(2)正确地使用秒表。如果您正在比较单个测试的平均时间,那么PostSharp和手写代码之间的区别只是几纳秒(假设您没有使用昂贵的特性),这是正常的。
发布于 2010-01-19 07:25:11
您能否更改您的测试,以便在下一次迭代中使用生成的字符串(写入控制台的字符串长度)或类似的内容?也许编译器优化您的程序的方式要么是根本不执行后置函数,要么是异步调用它,或者是在另一个cpu上执行,因为没有理由与其他迭代同步。如果您更紧密地链接它,这可能会迫使编译器同步操作。
https://stackoverflow.com/questions/2090299
复制相似问题