【问题标题】:Performance: using AspectJ to log run time of all methods性能:使用 AspectJ 记录所有方法的运行时间
【发布时间】:2014-12-03 17:38:02
【问题描述】:

我需要使用 logback 和 AspectJ 将应用程序中每个方法的运行时间记录到数据库中。这是一个企业应用程序,大约有几千个类,每个类中平均有大约 10 个方法。

我在这里遇到了主要的性能问题吗?我知道记录每一种方法都太过分了,但现在让我们先回顾一下。

【问题讨论】:

    标签: performance aspectj logback


    【解决方案1】:

    数千个类,每个类大约有十个方法,您必须为所有类实现跟踪日志记录?

    简短回答: 是的。

    长答案: 是的。
    您的表现将(或多或少)受到严重影响。要记录方法的运行时间,您需要(最少)一个环绕建议,该建议在方法进入和退出时花费时间,构造一个字符串并将其发送到记录框架。取决于你的数以万计的方法做什么,其中很多可能比方法的实际执行更耗时 - 方法越小开销越大。

    我不能代表您的应用程序,但是在为我的一个应用程序执行此操作后,激活跟踪的实际网络性能几乎减半。这是否也适用于您的应用程序,或者是否属于您的“主要性能问题”,只有您自己知道。

    因此,我的建议是简单地尝试一下。围绕命名空间中的每个方法编织跟踪建议可以很容易地完成。然后只需比较跟踪和未跟踪应用程序之间的性能即可。

    【讨论】:

    • 但是通过分散的日志语句手动进行日志记录同样耗时。 AspectJ 的伟大之处在于,您甚至可以在运行时动态地通过if() 切入点随意(取消)激活方面。您还可以创建一个抽象的基本方面来执行所有跟踪魔术,然后扩展几个具体的子方面来覆盖抽象切入点,该切入点实际上定义了您要拦截的目标类型。通过这种方式,您可以为多个日志记录、跟踪、分析或调试方案做好准备。我只是喜欢用 AspectJ 来做这件事。
    • 顺便说一句,为了按需查找性能瓶颈,有专门的分析工具(甚至包含在 JDK 中)可以动态连接到正在运行的应用程序并产生比日志语句少得多的开销,因为数据在较低的 JVM 级别上收集并显示它们不是应用程序的一部分,而是分析器的一部分。对于一致的生产日志,AspectJ 是您的工具,即如果您总是想要审核执行时间。性能损失只是粒度问题。挑战记录每个呼叫的要求,这是没有意义的。
    • 我的回答可能会引起误解,因为它试图保留性能是否会受到影响的问题。我没有说的是,尽管会影响性能,但这仍然是实现 OP 目标的最佳方法。我仍然使用和开发我的跟踪方面,我喜欢这些可能性——尽管我选择了一种不同的(效率较低的)在运行时(取消)激活它的方式:由于所有日志记录都是通过 logback 发生的,所以方面使用它自己的标记并且可以被激活并在运行时通过应用到日志记录的 TurboFilter 停用。
    • 我的 cmets 的目标是 OP 而不是你。这是为了补充您的好答案,而不是与之相矛盾。 :-)
    • 万岁,由 SO 自己的 AspectJ 先生证明! :D
    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2011-01-02
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多