【问题标题】:when is AOP code executedAOP 代码何时执行
【发布时间】:2013-09-11 08:08:55
【问题描述】:

我已经阅读了一些关于 AOP 的文章,它看起来是一个非常有趣且功能强大的工具。

但是性能呢?

例如,如果我创建一个名为MyMethodAspect 的方面属性会怎样。它会做一件简单的事情 - 在开始执行具有该属性的方法时,称为 MyMethodAspect 类中包含的代码。比如写一行文字——'starting...'

这就是基本示例 - 但是如果在启动方法时执行的逻辑要困难得多怎么办。 我能理解在启动方法时执行的代码只编译一次,然后 AOP 就不需要任何额外的性能了吗?

C#:

public void Do(int x){
Console.WriteLine(x);
}

我认为 IL 类似于(几乎相同):

 public void Do(int x){
    Console.WriteLine(x);
    }

和方面:

C#:

[MyMethodAspect]
    public void Do(int x){
    Console.WriteLine(x);
    }

所以我想 IL 是这样的:

 public void Do(int x){
Console.WriteLine("starting...");
    Console.WriteLine(x);
    }

MyMethodAspect 类真的只在编译阶段使用,之后就不需要任何额外的性能能力了吗?

我希望你能理解我的问题,我很难解释:)

谢谢

【问题讨论】:

  • 好的,你知道任何可以在编译时完成所有工作的 AOP 框架吗?
  • Postsharp 进行后编译。它获取编译器的输出并对其进行修改 - postsharp.net/aspects/under-the-hood
  • 后编译,但不在运行时 :) 这就是我想要的,也许我会尝试免费版本

标签: performance compilation aop


【解决方案1】:

让我们谈谈性能和 AOP 实现。

AOP 框架必须仔细考虑 3 个关键的事情才能更快:

  • 触发时间(运行时初始化)
  • 拦截机制
  • 消费者整合

在名义上的使用中,只有拦截机制和消费者集成才是真正重要的,除非您垃圾邮件重新启动您的应用程序。

通常在编译时工作的 AOP 框架没有任何触发时间,并且拦截机制与您直接在代码中直接编写建议类似。这就是为什么它们通常是高效的。

关于运行时 AOP 框架,它们通常不是真正的 AOP 模式,因为它们需要代理/工厂模式来拦截方法调用。代理意味着两种类型的开销:包装或消息接收器。第一种情况是可以接受的,而第二种情况确实很贵。

编译时和运行时 AOP 在消费者集成方面存在相同的问题:

  • 装箱/拆箱
  • 处理原代码
  • 定义建议的方式。

需要定义一个横向代码是合理的。

消费者集成代表了 AOP 框架的真正缺陷(性能问题)。

编译时间往往只有这一点需要管理。这就是为什么大多数时候它们的性能更好。

我写“通常”是因为它适用于常见的实现。

绝对地,运行时AOP框架可以做得更好,因为它可以在编织时拥有更多的信息。实现一个高效的运行时 AOP 框架更加困难(不可能?),因为它需要大量未记录的知识来操作 CLR。​​

经过大量研究,我开发了一种新风格的.NET 运行时 AOP 框架,它可以打破规则。 NConcern .NET AOP Framework 通过提供独有的拦截机制(基于方法交换)和通过简单的委托、表达式和 ILGenerator 的消费者集成来避免装箱/拆箱和不必要的客户端使用准备,从而提高效率(甚至超过基于编译时间)。例如,大多数时候需要使用反射来了解如何执行通知。很多 AOP 框架都对元数据进行了实际处理,这意味着他们在准备元数据时会产生开销。在一个好的实现中(如 NConcern 提供的),您可以在真正处理之前获得这些信息,因为 AOP 框架为您提供了描述如何生成 Advice 的功能,而不是直接使用反射和装箱对其进行编码。即使在 NConcern 的基本界面(直接建议定义)中,您也可以选择是否捕获元数据。

总之,在定义你的通知时要小心客户端 AOP 接口,它代表了大多数情况下的实际性能开销。

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多