C# AOP性能开销

C# AOP性能开销,c#,aop,C#,Aop,我一直在搜索一些关于典型AOP任务的性能测试。但是我找不到,你能帮我吗? 我主要考虑的是Castle、Unity和PostSharp,尽管这对我的项目来说可能太贵了。我也没有看到任何定量比较,所以这个答案可能还远远不够完整 很难将Castle或Unity的性能与PostSharp进行比较-动态代理使用Castle和Unity,PostSharp会增加开销。因此,如果性能对您至关重要,那么像PostSharp这样的编译解决方案将永远更好。在运行时生成AOP代理意味着动态生成IL代码和大量使用反射

我一直在搜索一些关于典型AOP任务的性能测试。但是我找不到,你能帮我吗? 我主要考虑的是Castle、Unity和PostSharp,尽管这对我的项目来说可能太贵了。

我也没有看到任何定量比较,所以这个答案可能还远远不够完整

很难将Castle或Unity的性能与PostSharp进行比较-动态代理使用Castle和Unity,PostSharp会增加开销。因此,如果性能对您至关重要,那么像PostSharp这样的编译解决方案将永远更好。在运行时生成AOP代理意味着动态生成IL代码和大量使用反射

因此,有意义的性能测试必须使用相同的技术来比较解决方案——您可以尝试比较Castle动态代理和Unity拦截代理实现


我不太了解前者,但对于后者,仍然有三种不同的场景需要比较——透明代理(
MarshalByRefObject
)、接口代理和子类化代理——每种代理都有自己的一组使用场景和自己的性能开销。据我所知,透明代理非常慢,不应该在AOP场景中使用。接口和子类型代理会动态生成一些IL,这与Castle DP所做的是一样的,因此我认为差异不应该太大(但这里也没有定量结果)。

如果您正在寻找一个轻量级AOP工具,那么有一篇文章“使用动态装饰器向对象添加方面”(http://www.codeproject.com/KB/architecture/aspectddecorator.aspx).它又薄又有弹性

它描述了一种在运行时将方面添加到对象中的方法,而不是在设计时将方面添加到类中。这种方法的优点是,您可以在使用对象时决定是否需要方面


当今的大多数AOP工具在类设计时在类级别定义方面。并且,当您使用类的对象时,您没有灵活性。

如果性能在您的项目中至关重要,请确保AOP的使用是面向性能的,因为除非使用不符合要求,否则AOP框架的开销很少很低

例如,如果您使用DynamicProxy,您可以选择使用反射或调用procedure()方法调用backing处理

另一个例子:大多数AOP框架都会向您的“建议”提供MethodInfo。他们获取此MeterData的方式可能会改变您的性能,因为GetMethodFromHandle在极端并发处理(带锁的字典访问)中可能非常糟糕

要记住的另一件重要事情是:使用修改过的overlod for Advice方法,因为如果AOP框架必须准备太多的信息(参数、方法信息等),您将为此付出代价(性能开销)。不幸的是,如果拦截是完美的,有时没有好的用户端界面来实现性能建议事件


关于更多细节,在本文中,我给出了关于AOP框架性能问题的反馈。

定义性能测试。编译时或运行时?PostSharp实际上将您的方面编织到您的代码中。不涉及任何实际的AOP开销。