3

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

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

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

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

谢谢你。

4

3 回答 3

1

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

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

于 2010-01-19T00:49:05.367 回答
1

我做过性能测试。它们发表在PostSharp 博客上

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

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

于 2010-01-19T07:19:40.417 回答
0

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

于 2010-01-19T07:25:11.600 回答