【问题标题】:PostSharp has no effect on speedPostSharp 对速度没有影响
【发布时间】:2010-01-19 00:44:07
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 请发布一个简短但完整的程序来显示问题,以便其他人可以使用实际代码和事实而不是您对它的解释。我确信您的测试有些奇怪,因为 PostSharp 会在每个方法中添加一些代码,除了您要求它添加的实际代码之外,这不太可能对运行时没有影响。

标签: c# .net performance postsharp


【解决方案1】:

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

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

【讨论】:

  • 就像我说的,字符串不是固定的。它们包括随机数。此外,VS 中的调试版本不会优化任何内容。它们在这种方式下非常愚蠢,这就是为什么它们是一致性的良好参考。
  • @Alex:也许你应该包含你的测试代码的骨架。没有具体细节,我认为 nobugz 和我已经说了很多。 400 亿次迭代的几毫秒的运行时间是不可能的,测试之间只有几纳秒的增量也是不可能的。
  • 还有一件事 - 运行整个(n = 400 亿)测试需要多长时间?多次执行任何事情可能至少需要几分钟才能运行;如果它发生得比这更快,那么它可能不会运行那么多次。
  • 需要一个多小时。至于代码,真的没有太多的样本。有一个用于调用该函数的 for 循环,一个用于生成随机字符串的函数中的 for 循环(以确保该函数不是即时的并且不会在 Release 版本中得到优化)和一个用于生成随机字符串的 postsharp 属性中的 for 循环。
  • @Alex:你提到如果 PostSharp 属性存在,它会生成并删除几百个字符串。超过 400 亿次迭代,仅此一项就需要一个多小时。我的通灵调试器告诉我 PostSharp 代码永远不会被执行,或者可能是在测试循环之外执行。你在里面设置断点了吗?
【解决方案2】:

我已经进行了性能测试。它们发表在PostSharp Blog

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多