`
geeksun
  • 浏览: 953007 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用AOP统计方法的执行时间

 
阅读更多
1.  需求背景
性能调优阶段,需要找出执行时间比较长的方法,针对这些方法进行调优。
 
2.  可行方案
一种是传统的在每个方法前后获取System.currentMis(),然后得到方法的执行时间。
这种方式的缺点是方法多会写很多耦合代码,而且不可重用,测试完需要删掉。
 
另一种使用AOP监控方法的前后点,监控方法的执行时间,比较优雅且无侵入。
可行的方案之一是使用 Around Advice, 环绕通知可在方法执行前后做一些操作。
 
AOP,面向切面编程,Aspect Oriented Programming, 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
 
3. AOP
jar librarys requires:
<dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
    <version>1.5.4</version>
</dependency>
<dependency>
    <groupId>cglib</groupId>
     <artifactId>cglib-nodep</artifactId>
      <version>2.2</version>
</dependency>
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.6</version>
</dependency>
 
Spring配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>
  
AOP实现类:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

/**
 * Created by jzq1999 on 2017/4/19.
 * 通过aop拦截后执行具体操作
 */
@Aspect
@Component
public class DaoTimeInterceptor {

    private final static String POINT = "execution (* com.tzx.*.po.springjdbc.dao.imp.*.*(..))";

    @Pointcut(POINT)
    public void recordLog(){}

    @Around("recordLog()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Object obj = pjp.proceed(pjp.getArgs());
        stopWatch.stop();

        long cost = stopWatch.getTotalTimeMillis();
        if(cost > 10) {
            MethodSignature signature = (MethodSignature) pjp.getSignature();
            String methodName = signature.getDeclaringTypeName() + "." + signature.getName();

            System.out.println("----------- 执行" + methodName + "方法, 用时: " + cost + "ms -----------");
        }

        return obj;
    }

}
 
分享到:
评论

相关推荐

    利用Spring AOP记录方法的执行时间

    给大家介绍的是spring的aop来实现方法级的执行时间的记录监控,以此来评估方法的性能以及针对性的对已存在的方法进行优化。对于监控,我们比较关注监控的可靠性和性能,准确,高效,这才能在不影响整体性能的情况下...

    AOP_With_Roslyn:罗斯林AOP

    下表是通过集成了dotnet aop的dotnet aop测试收集统计信息而生成的: 班级 方法(行) 命中率 总时间 平均时间 TestLine指令 TestException(55) 1个 2881 2881 测试参数 TestArgumentsFor(13) 1个 543 ...

    C# 面向切面编程--监控日志记录方案

    对于所有需要进行日志记录的方法的采用对该方法所在的类进行...因为方法内部的日志一般都要统计时间长度,动态代理Stopwatch的Start方法和Stop方法,在Start和Stop调用的时后记录出方法的执行时间和中间参变量的值。

    mybatis统计每条SQL的执行时间的方法示例

    此方案主要是通过环绕切面的方式将mapper包下的接口方法,然后前后计算时间差即可。这就是典型的AOP知识,不过这种计算比较粗糙,但是也是个办法。具体方法如下: @Aspect @Component @Slf4j public class ...

    spring-boot-execution-metric:测量关键代码块的执行时间,并将统计信息公开为执行器指标

    测量关键代码块的执行时间,并将统计信息公开为执行器指标 提供一种轻量级的方法来测量(选定的)关键代码执行(例如调用外部系统)的运行时间,并将其公开为Spring Boot执行器度量标准。 如何使用 玛文 ...

    积分java源码-perfstats-lib:用于收集和公开方法性能统计数据的简约库

    记录方法执行的持续时间 测量值被添加到要处理的值列表中,调用立即返回 后台线程处理新的测量、更新聚合值等。 收集的值通过发布者提供,例如 JmxPublisher 和 PeriodicalLogPublisher 它不是什么 Perfstats-lib ...

    spring-boot mybaits shiro redis整合

    Druid数据库连接池,监控数据库访问性能,详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 数据库密码加密。 2、持久层 ====== mybatis持久化,PageHelper分页。Transtraction注解Jta事务。 3、...

    大学毕设:-基于SpringBoot+Mybatis开发的分布式校园租赁系统+源代码+文档说明

    7. 统计报表模块:管理员可查看按类别时间查看物品租用情况的统计报表。 8. 实时通信模块:基于Websocket实现实时通讯,用户可以和客服沟通租赁、支付等操作中出现的问题,出租人和承租人之间可在线沟通。(简单实现...

    ActivityLaunchTimeCollector:这是Android Activity启动时间的python脚本

    一、功能说明(仅适用于本地启动时间统计,如果要收集线上各个用户收集启动时间,可通过 AOP 实现)统计项目/模块中所有的Activity,批量执行命令 adb shell am start -W packageName/ActivityName 启动并获取输出...

    Spring面试题

    在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。 Spring 框架的 IOC 容器采用类型 2 和类型3 实现。 面向方面的编程 ...

    详解在Javascript中进行面向切面编程

    面向切面编程(Aspect-oriented programming,AOP)是一种编程范式。...你想看一下某个函数的平均执行时间,于是你又在弹窗里加上了性能统计代码。 时间久了,你会发现你的业务逻辑里包含了大量的和业务无关

    spring-boot mybaits spring security redis整合

    Druid数据库连接池,监控数据库访问性能,详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 数据库密码加密。 2、持久层 ====== mybatis持久化,PageHelper分页。Transtraction注解Jta事务。 3、...

    基于微信小程序的学习自律养成小程序的实现+ssm框架.rar

    利用Spring框架实现了控制反转(IoC)和面向切面编程(AOP),提高了代码的可维护性和可测试性。 使用Spring MVC实现了前端请求的分发和处理,将业务逻辑与视图层进行了有效分离,提高了系统的可扩展性。 结合...

    leetcode跳跃-leetcode-everyday:日常总结做的leetcode编程题/剑指Offer

    运行每个类中的main函数可以执行给定的测试用例,利用AOP统计了用时 代码部分皆为手敲 经过一次次优化 相关数据结构 :small_blue_diamond: :small_orange_diamond: 题型和题解 1: 2: 3: 剑指Offer 3: 4: 5: 6: 7:...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    基于ssm+Vue的期末考试考务管理系统wlw(源码+部署说明+系统介绍+数据库).zip

    考试管理:实现考试的创建、编辑、删除以及查询等功能,支持多种考试类型(如选择题、填空题、简答题等),同时支持考试时间限制和考试场地设置。成绩管理:记录用户的考试成绩,支持成绩查询、统计和导出等功能,方便...

    iBase4J分布式系统-其他

    iBase4J主要功能:1、数据库:Druid数据库连接池,监控数据库访问性能,统计SQL的执行性能。数据库密码加密,加密方式请查看PropertiesUtil,decryptProperties属性配置需要解密的key。2、持久层:mybatis持久化,...

    最新Java面试宝典pdf版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    Java面试宝典2010版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 71、说出一些常用的类,包,接口,请各举5个 72、java中有几种...

Global site tag (gtag.js) - Google Analytics