Stop Watch - java获取方法的具体执行时间

本文介绍了如何使用Apache common框架中的工具类`org.apache.commons.lang.time.StopWatch`来精确测量Java方法执行时间,通过`start`、`stop`、`split`和`getSplitTime`等方法实现对方法执行过程中的各个步骤进行详细的性能分析,避免了传统方法获取时间的不精确性。文章提供了简单的模拟示例和更精确的模拟代码,并指出现有代码的不足之处,以及改进方法。

大家都知道java中,如果想查看一个方法执行具体的时间,最简单的方法就是在方法执行前后使用long  System.currentTimeMillis()获取当前的时间,再用时间相减。其实这样获取的时间是相对不精确的。例如在下面的程序中: 

long startTime = System.currentTimeMillis();

method();

long endTime = System.currentTimeMillis();

executeTime = endTime - startTime

其实method可以是一个很简单的方法也可以是一个很复杂的方法,在method中,我们可以去修改各种各样的信息,可以去和第三方的jar包进行交互,这样其实他的执行时间有可能会取决于和第三方的交互时间,而第三方的执行时间,有可能还有各种网络连接,数据库连接等相关,所以我们往往是不能很精确的获取这个时间的,最精确的办法是用反射的原理,利用Spring的AOP编程,逐步地去查看每个方法的执行细节所花费的时间,但这样往往很复杂,实际上,Apache中的common框架中的一个工具类org.apache.commons.lang.time StopWatch 可以很好的模拟了秒表,通过它的split方法和getSplitTime方法,可以很好地看出各分步骤对性能下降的贡献值来。

1. 简单的模拟:

 watch.start();

        logger.info("Start to get information from VCenter: " + vCenter);

        try {

            vc = inventory.getVCenterInfo();

        } catch (Exception e) {

            logger.error("cannot get VCenter info: " + vCenter , e);

            return;

        }

        watch.stop();

logger.info(String.format("End to get information from VCenter: %s, spend time:%s(ms) ", vCenter, watch.getTime()));

 

2. 更加精确的模拟:

  1. stWatch.start();  
  2.   
  3.    
  4.   
  5. step1();  
  6.   
  7.    
  8.   
  9. stWatch.split();  
  10.   
  11.    
  12.   
  13. System.out.println("Time consumed by step1: "+stWatch.getSplitTime());  
  14.   
  15.    
  16.   
  17. step2();  
  18.   
  19.    
  20.   
  21. stWatch.split();  
  22.   
  23.    
  24.   
  25. System.out.println("Time consumed by step1 and step2: "+stWatch.getSplitTime());  
  26.   
  27.    
  28.   
  29. stWatch.stop();  

 

但如上的代码有些许不足: 每次getSplitTime得到的值都是当前所有步骤的总和,而不是当前这个步骤的耗时值,以上面代码为例,它没有直接地得出step1和step2两个步骤的各自耗。

 

于是原来基础上加了两个方法(加了方法的源码见附件): splitAndSaveTime和getSplitTimeByStep。这样的演示代码如下:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值