文档章节

Commons-lang3提供的StopWatch执行时间监视器

独钓渔
 独钓渔
发布于 06/26 01:16
字数 938
阅读 12
收藏 0

Commons-lang3提供的StopWatch执行时间监视器, spring也提供了同样功能的工具

前言
我们如果要统计一段代码的执行时间:我们的办法是

public static void main(String[] args) {
        long startTime=System.currentTimeMillis();   //获取开始时间
        
        //函数主体代码
        //...

        long endTime=System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
        
    }

倘若我们要展示成秒、甚至分钟,还得我们自己处理
可能到了JDK8以后,我们变得稍微优雅一些了 可以这么处理:

Instant start = Instant.now();
        //doSomething();
        Instant end = Instant.now();

        Duration duration = Duration.between(start, end);
        System.out.println("millis = " + duration.toMillis());

这个比上面优雅一点,灵活度也更强一些。但定义的变量有点多,总体上还是不够优雅。因此本文介绍StopWatch执行时间监视器,来统计我们程序的执行时间,非常多的方便和优雅。

StopWatch:执行时间监视器
StopWatch有很多开源的框架都有提供类似的功能。比如Apache的commons-lang3,还有Spring framwork自己都有提供。

但本文只介绍lang3里面的,功能上大同小异。而且Apache提供的功能强大,并且lang3包一般是我们必导的包,但spring的就不一定了(比如纯java项目,是不用导入spring包的),lang3的功用性也更强些。

public static void main(String[] args) throws Exception {
        StopWatch watch = StopWatch.createStarted(); //创建后立即start,常用
        //StopWatch watch = new StopWatch();
        //watch.start();

        Thread.sleep(1000);
        System.out.println("统计从开始到现在运行时间:" + watch.getTime() + "ms"); //1000ms

        Thread.sleep(1000);
        watch.split();
        System.out.println("从start到此刻为止的时间:" + watch.getTime());
        System.out.println("从开始到第一个切入点运行时间:" + watch.getSplitTime()); //2245

        Thread.sleep(1000);
        watch.split();
        System.out.println("从开始到第二个切入点运行时间:" + watch.getSplitTime());

        watch.reset(); //重置后必须使用start方法
        watch.start();
        Thread.sleep(1000);
        System.out.println("重新开始后到当前运行时间是:" + watch.getTime()); //1000

        watch.suspend(); //暂停
        Thread.sleep(6000); //模拟暂停6秒钟

        watch.resume(); //上面suspend,这里要想重新统计,需要恢复一下
        System.out.println("恢复后执行的时间是:" + watch.getTime()); //1000  注意此时这个值还是1000

        watch.stop();
        System.out.println("花费的时间》》" + watch.getTime() + "ms"); //1002ms
        System.out.println("花费的时间》》" + watch.getTime(TimeUnit.SECONDS) + "s"); //1s 可以直接转成s

    }

如上就是StopWatch的基本使用方法。

StopWatch的使用细节

getTime和getSplitTime有啥区别呢?
此处我们看看getNanoTime()和getSplitNanoTime()即可

 public long getNanoTime() {
        if (this.runningState == State.STOPPED || this.runningState == State.SUSPENDED) {
            return this.stopTime - this.startTime;
        } else if (this.runningState == State.UNSTARTED) {
            return 0;
        } else if (this.runningState == State.RUNNING) {
            return System.nanoTime() - this.startTime;
        }
        throw new RuntimeException("Illegal running state has occurred.");
    }

 public long getSplitNanoTime() {
        if (this.splitState != SplitState.SPLIT) {
            throw new IllegalStateException("Stopwatch must be split to get the split time. ");
        }
        return this.stopTime - this.startTime;
    }

我们发现:

  • 调用getSplit相关方法前,必须调用Split方法

spilit()方法源码如下:

public void split() {
        if (this.runningState != State.RUNNING) {
            throw new IllegalStateException("Stopwatch is not running. ");
        }
        this.stopTime = System.nanoTime();
        this.splitState = SplitState.SPLIT;
    }

我们发现调用split方法后,watch的状态改为了SPLIT。**且,且,且stopTime 设置为了当前时间。**因此此处我们的stopTime禁止了,这个时候调用getSplitNanoTime,用stopTime减去startTime即可。因此用此方法可以插入先停止stopTime,最后再输出。

而getTime()就是拿当前的时间戳,减去startTime,一般不涉及到stopTime的值,因此splitTime处理计算时间显然更加的灵活,但是,一般我们使用getTime()就足够了

最后
很多时候,写代码也是一种艺术。希望我们能有追求更加美好事物的心,这点对于接纳新知识特别重要。因此此处推荐这个监视器来代替之前的的使用,能让我们更加灵活的控制程序代码。

本文转载自:https://blog.csdn.net/f641385712/article/details/82591603

独钓渔
粉丝 48
博文 394
码字总数 148262
作品 0
沙坪坝
系统管理员
私信 提问
commons 工具类使用mark

commons-lang3包中对我们有用的类主要有: 1.StringUtils 该类主要提供对字符串的操作,对null是安全的,主要提供了字符串查找,替换,分割,去空白,去掉非法字符等等操作 2.ObjectUtils 主要是对n...

真爱2015
2016/01/07
16
0
Stopwatch 例子性能测试- 测试代码执行的时间

第一种使用spring的 第二种使用方法(org.apache.commons.lang3.time.StopWatch): 第三种使用方法(guava): 读取Stopwatch结果: 在结束计时后下一步就是读取计时结果了。Stopwatch类提供...

weiliu007
2016/09/29
105
0
Spring AOP 实现方法日志记录以及执行时间打印

注意:proxy-target-class="true" 这是决定是走jdk代理还是spring cglib代理的。高版本的(貌似)可以忽略。 1.在spring 相关配置文件中假如如下配置: <!-- 日志时间打印 --> <aop:config ...

轻量级赤影
01/16
0
0
apache StopWatch基本使用

pom: <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> org.apache.commons.lang.time.StopWatch (1) privat......

Atom_me
2015/07/16
817
0
Java中支持深浅拷贝的第三方库

深拷贝 Apache旗下的Commons-Lang3包有一个序列化的工具,可以做深拷贝。 当然前提是你的类实现了序列化接口。 Java Deep Cloning Library是我觉得最好用的一个。它的深拷贝通过反射实现,适...

xiaomin0322
2018/11/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

拥有有趣灵魂的程序员们,程序员访谈(一)

点击上方关注我们,让小care关爱你! 程序员群体一直都是低调多金的代表,而近段时间以来,程序员在网络上除了高薪之外,总是会和屌丝、苦逼、格子衫、没情趣...联系在一起。黑程序员的段子也...

ITCare
今天
23
0
Linux输入法fcitx的安装问题

Fcitx 总共要安装的包如下 fcitxfcitx-binfcitx-config-commonfcitx-config-gtk | fcitx-config-gtk2fcitx-datafcitx-frontend-allfcitx-frontend-gtk2fcitx-frontend-gtk3......

CHONGCHEN
今天
13
0
网络基础

前言: 最近整理一些以前的学习笔记(有部分缺失,会有些乱,日后再补)。 过去都是存储在本地,此次传到网络留待备用。 计算机网络的功能: 1.数据通信; 2.资源共享; 3.增加数据可靠性; 4....

迷失De挣扎
今天
13
0
spring boot升级到spring cloud

1、先升级spring boot 版本到2.1.3 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEAS......

moon888
今天
26
0
从蓝鲸视角谈DevOps

DevOps源于Development和Operations的组合 常见的定义 DevOps是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变...

嘉为科技
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部