.NET AOP 性能比较

  在.NET中要实现AOP有多种办法,至少包含如下几种:

  1. 微软企业库Microsoft Enterprise Library
  2. postsharp(收费)
  3. ContextBoundObject
  4. Castle.Core
  5. Remoting的RealProxy
  6. ...

对于第一种,需要安装较大的类库,第二种收费,因此这两者使用相对没那么多,本文只比较后面三种的性能情况。

先看结果

三种方法分别使用AOP和非AOP得方式调用相同空方法1000000次的结果如下:

ContextBoundObject Proxy Castle
Original: 5399 4 4
Aop: 8420 1456 48

可以看出,性能差距是巨大的,为什么有这么大的差距呢?接下来分析一下原理。

ContextBoundObject

通过ContextBoundObject来实现AOP,其中有大约60%的时间花在GetCustomAttribute的反射上,另外40%则是MarshalByRefObject(ContextBoundObject的基类,实际上ContextBoundObject什么事情都没做,只是单纯的继承了MarshalByRefObject)内部上下文管理上,它需要管理些啥呢?ContextBoundObject是一个上下文对象的基类,继承自它的子类将被一个特别的上下文管理起来,这个上下文包括一系列的属性集合或者规则,当进入或者离开上下文时,将强制执行规则。当使用ContextBoundObject实现AOP时,除了性能底下,其必须继承自ContextBoundObject,对于单继承的语言来讲可能带来不便。

Proxy

Proxy实现AOP会利用到RealProxy和TransparentProxy,它们分别是干啥的呢?

TransparentProxy:在 CLR 中在 IL 层面最大程度扮演被代理的远端对象,从类型转换到类型获取,从字段访问到方法调用。对 CLR 的使用者来说 TP 和被其代理的对象完全没有任何区别,只有通过 RemotingServices.IsTransparentProxy 才能区分两者的区别。

RealProxy:是提供给 CLR 使用者扩展代理机制的切入点,通过从 RP 继承并实现 Invoke 方法,用户自定义代理实现可以自由的处理已经被从栈调用转换为消息调用的目标对象方法调用,如实现缓存、身份验证、安全检测、延迟加载等等。

使用Proxy来实现AOP其消耗主要来自TP和RP两个对象的实例化以及“对象引用 -> TP -> RP -> 实际对象”的调用链。

Castle

Castle的本质是创建继承原来类的代理类,重写虚方法实现AOP功能。内部通过大量的Reflect.Emit + OpCode编程来实现高性能的保证,可以在很多开源项目中找到Castle的身影。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 团队开发框架实战—面向切面的编程 AOP 引言 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统...
    Bobby0322阅读 9,695评论 4 49
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,513评论 11 349
  • 非暴力沟通的第一个要素是观察。我们仔细观察,正在发生的事情,并清楚地说出观察结果,非暴力沟通并不要求我们保持完全的...
    米米心臻阅读 2,833评论 0 0
  • 想把我的故事告诉你,想把我听到的故事告诉你,想听你讲给我的故事。 世间多有痴情男女,可携手赏皓月,可嬉戏于美景,可...
    吟千寻阅读 4,451评论 0 3

友情链接更多精彩内容