代码之家  ›  专栏  ›  技术社区  ›  Alex K

后竖琴对速度没有影响

  •  3
  • Alex K  · 技术社区  · 15 年前

    我偶然发现了一个不可能良好的表现行为与Postshap。为了评估我编写的一个小程序的速度,它将执行一个函数指定的次数,如果启用了postsharp,它将生成和删除几百个字符串,就在内存中(非固定合成,因此它们不会自动实习)。循环以非常长的时间(几毫秒)执行。

    现在,我无法在数百万次运行中测量差异,大约400亿次迭代的疯狂运行与进行相同次数调用的非PostSharp版本相比只差几纳秒。对我来说,这是不可能的。我的考试一定有问题。我让我的同事对代码进行了同行评审,所以我非常有信心代码会按我的意愿执行。

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

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

    谢谢您。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Aaronaught    15 年前

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

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

        2
  •  1
  •   Dennis    14 年前

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

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

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

    盖尔

        3
  •  0
  •   Simon D.    15 年前

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