AOP性能开销

9

我一直在寻找关于典型AOP任务的性能测试。但是我没有找到任何相关的内容,你能帮我吗? 我主要想了解Castle、Unity和可能的PostSharp的情况,尽管后者对我的项目来说可能太昂贵了。


定义性能测试。编译时还是运行时? - TomTom
PostSharp实际上是将你的方面织入到你的代码中。没有任何实际的AoP开销涉及其中。 - user47589
3个回答

4
我也没有看到过任何数量比较的数据,因此这个答案可能远非完整。
很难比较Castle或Unity与PostSharp的性能 - Castle和Unity通过动态代理使用运行时织入,而PostSharp则在编译阶段添加开销。因此,如果性能对您至关重要,则编译后的解决方案(如PostSharp)始终更好。在运行时生成AOP代理意味着动态生成IL代码和大量反射使用。
因此,有意义的性能测试必须比较使用相同技术的解决方案 - 您可以尝试比较Castle Dynamic Proxy和Unity Interception代理实现。

我不太了解前者,但在后者的情况下,仍然有三种不同的方案可以比较 - 透明代理 (MarshalByRefObject)、接口代理和子类代理 - 每种方案都有其自己的使用场景和性能开销。从我阅读的资料来看,透明代理非常慢,不应在AOP场景中使用。接口和子类型代理会动态生成一些IL代码,这与Castle DP所做的相同,因此我认为差异不应该太大(但是,这里没有量化结果)。


1
如果您正在寻找一个轻量级的AOP工具,可以参考一篇文章“使用动态装饰器为对象添加方面”(http://www.codeproject.com/KB/architecture/aspectddecorator.aspx)。它非常轻巧和灵活。
该文章描述了一种在运行时向对象添加方面的方法,而不是在设计时向类添加方面。这种方法的优点是,当您使用对象时,您可以决定是否需要一个方面。
大多数现今的AOP工具在类设计时定义方面,而当您使用类的对象时,您就没有灵活性了。

0
如果在您的项目中性能至关重要,请确保您对AOP的使用是面向性能的,因为除非使用不合规,否则AOP框架的开销很少会很差。
例如,如果您使用DynamicProxy,您可以选择使用反射调用后备处理或调用Proceed()方法。这会影响性能。
另一个例子:大多数AOP框架都会将MethodInfo提供给您的“建议”。它们获取此元数据的方式可能会影响您的性能,因为在极度并发的处理中,GetMethodFromHandle可能非常糟糕(使用锁的字典访问)。
还有一件重要的事情要记住:使用适当的Advice方法重载,因为如果AOP框架需要准备太多信息(参数、methodinfo等),您将为此付出代价(性能开销)。不幸的是,有时候即使拦截完美,也没有好的用户端接口来实现高效的建议事件。
有关更多详细信息,请参见when-is-aop-code-executed中的帖子,我在其中提供了有关AOP框架性能问题的反馈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接