代码之家  ›  专栏  ›  技术社区  ›  LiorH

使用aop对性能的影响

  •  37
  • LiorH  · 技术社区  · 15 年前

    我的问题是,您是否遇到了使用aop(特别是SpringAOP)带来的性能问题?

    8 回复  |  直到 5 年前
        1
  •  36
  •   krosenvold    15 年前

    只要你 控制 关于你的AOP,我认为它很有效。无论如何,我们确实存在性能问题,因此根据自己的推理,我们无法完全控制;)这主要是因为编写方面的任何人都必须 满的 了解所有 系统中的方面及其相互关系。如果你开始做“聪明”的事情,你可以在一瞬间超越自己。在一个大型项目中,如果有很多人只看到系统的一小部分,那么在性能方面做一些聪明的事情可能会非常危险。这个建议可能在没有AOP的情况下也适用,但是AOP可以让你用一些真正优雅的方式射自己的脚。

    Spring还将代理用于范围管理和 那是 这是一个容易出现意外性能损失的领域。

    但考虑到您拥有控制权,AOP唯一真正的痛点是对调试的影响。

        2
  •  28
  •   Nathan    15 年前

    如果性能将成为一个问题,我们已经使用 AspectJ

    因为它使用字节码编织(编译时和运行时有很大区别),所以它是最快的AOP框架之一。见: AOP Benchmarks

        3
  •  21
  •   Jon Skeet    15 年前

    如果您将它用于在非常紧密的循环中使用的调用,那么 对于一个重要的性能打击。如果它只是用于每个请求检查一次安全性并缓存各种内容,我看不出它有多重要——但这就是为什么您应该对其进行评测和基准测试 应用程序。

    我意识到“用你的应用程序测量”可能不是你想要的答案,但很可能是你猜得到的答案:)

        4
  •  7
  •   cliff.meyers    15 年前

    如果您使用的是基于代理的AOP,那么您所说的是每应用一个方面额外调用一个Java方法。对性能的影响可以忽略不计。唯一真正关心的是代理的创建,但这通常只在应用程序启动时发生一次。SpringSource博客上有一篇很好的帖子:

    http://blog.springsource.com/2007/07/19/debunking-myths-proxies-impact-performance/

        5
  •  1
  •   Tony THONG    6 年前

    从理论上讲,如果您使用AOP实现硬耦合所能实现的功能,那么就不会有性能问题,不会有开销,也不会有额外的方法调用,除非您是免费编织的。AOP框架为您提供了一种消除硬耦合和分解横切关注点的方法。

    实际上,AOP框架可以引入3种类型的开销:

    • 拦截机修工
    • 消费者整合(制定建议的方式)

    有关更多详细信息,请参阅 when-is-aop-code-executed

    只是要小心如何实现建议,因为横向代码是装箱/拆箱和反射的诱惑(性能方面代价高昂)。

    如果没有AOP框架(硬耦合您的交叉关注点),您可以更轻松地开发假定的建议(专门用于每种治疗),而无需装箱/拆箱和反思。

    您必须知道,大多数AOP框架都没有提供完全避免装箱/拆箱和反射的方法。

    我开发了一个用于响应大多数缺失需求的解决方案,主要集中在三个方面:

    • 用户友好(轻量级,易于学习)
    • 透明(不包含破坏性代码)

    您可以在此处找到我的开源项目: Puresharp API .net 4.5.2+ 先前 NConcern .NET AOP Framework

        6
  •  0
  •   Gary    13 年前

    您有没有想过使用AOP工具在需要时在运行时向对象添加方面?有一个是针对.net的“使用动态装饰器向对象添加方面”(http://www.codeproject.com/KB/architecture/aspectddecorator.aspx). 我相信您可以为Java编写一个类似的。

        7
  •  0
  •   abishkar bhattarai    12 年前

    如果您使用某个单一框架来处理方面,可能会出现一些性能问题。接下来,如果您在某个单一框架之上创建抽象,并且方面处理是从框架中完成的,那么很难找出与性能问题相关的问题的原因。如果你真的更关心性能和小时间片,我建议写自己的方面。没有人想重新发明轮子,但有时更好,它可能是最好的。你可以写自己的AOP联盟抽象实现。

        8
  •  0
  •   Qix - MONICA WAS MISTREATED    8 年前

    我在当前项目的批处理过程中使用了SpringAOP来管理数据库事务。

    起初,我们认为不会有性能问题,但我们没有考虑到我们数千次调用数据库的等式。aop中的一个方面调用对性能影响不大,但将其乘以数千,结果表明,由于这些额外的方法调用,新系统比旧系统更差。

    我想说aop是一个很好使用的系统,但是请注意有多少方法调用被添加到您的应用程序中

        9
  •  0
  •   user2023577    4 年前

    11年后的问题,看看这是多么恶化的情况。

    示例:绝大多数人认为,将一个简单的@Transactional spring java注释放到某个方法中,并让spring在调用方和被调用方代理组件之间架起桥梁是正常的。现在他们有20多帧不可调试的“魔法”代码。JIT编译器很快被超越,无法再尝试内联,或者最终导致大量生成的类导致内存膨胀。

    在这个“框架用户”时代,懒散是没有限制的。难怪普通http调用的e2e时间从100毫秒增加到10秒。难怪您需要2GB来运行一个糟糕的servlet容器,而这个容器过去的运行速度是128MB。不要让我开始讨论记录异常堆栈跟踪的成本。。。