当前位置: 首页 > 后端技术 > Java

别再用System.currentTimeMillis()来统计耗时了,太low了,StopWatch就是这么好用!

时间:2023-04-02 01:33:19 Java

背??景你还在使用System.currentTimeMillis...耗时统计吗?例如下面的代码:/***@author:stacklength*@from:公众号Java技术栈*/@TestpublicvoidjdkWasteTime()throwsInterruptedException{longstart=System.currentTimeMillis();线程.sleep(3000);System.out.printf("耗时:%dms.",System.currentTimeMillis()-start);}System.currentTimeMillis...这个方法确实是耗时统计用的最多的,因为不需要引入JDK可以处理其他JAR包,但有几个不便之处:1)需要定义初始时间值,然后使用当前时间进行手工计算;2)多个任务统计时间比较麻烦,如果开始赋值错误,可能会出现逻辑问题;还有其他更好的选择吗?答案是肯定的:秒表!StopWatchStopWatch是一个耗时统计工具类:常用的StopWatch工具类有两个:commons-lang3(Apache提供的通用工具包)spring-core(Spring核心包)。虽然这两个工具类的名字相同,但是用法却大不相同,本文栈长将分别为大家展示。commons-lang3提供的StopWatch依赖介绍commons-lang3是Apache开源的通用工具包,需要额外的Maven依赖:org.apache.commonscommons-lang3${commons-lang3.version}简单示例创建StopWatch实例的方法有以下三种:1)使用new关键字StopWatchsw=newStopWatch();2)使用创建工厂方法StopWatchsw=StopWatch.create();3)使用createStarted方法StopWatchsw=StopWatch.createStarted();该方法不仅会创建一个实例,还会开始计时。我们来看一个简单的例子://创建一个StopWatch实例并开始计时StopWatchsw=StopWatch.createStarted();//休眠1秒Thread.sleep(1000);//1002msSystem.out.printf("Time-consuming:%dms.\n",sw.getTime());更多用法继续前面示例的演示。暂停计时://暂停计时sw.suspend();Thread.sleep(1000);//1000msSystem.out.printf("暂停时间:%dms.\n",sw.getTime());因为是挂起,所以还是1000ms,暂停后中间休眠的1000ms不算。恢复计时://恢复计时sw.resume();Thread.sleep(1000);//2001msSystem.out.printf("恢复耗时:%dms.\n",sw.getTime());因为resumed,结果是2001ms,恢复后中间的1000mssleep算进去了。停止计时:Thread.sleep(1000);//停止计时sw.stop();Thread.sleep(1000);//3009msSystem.out.printf("总耗时:%dms.\n",sw.getTime());在停止计时之前,它休眠了1000ms,所以结果是3009ms。停止计时后,不能再使用暂停和恢复功能。复位计时://复位计时sw.reset();//启动计时sw.start();Thread.sleep(1000);//1000msSystem.out.printf("复位耗时:%dms.\n",sw.getTime());因为重置了计时,重新计时后变成了1000ms。本文所有完整示例源码均已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!下面看一个Spring提供的StopWatch的简单例子://创建一个StopWatch实例StopWatchsw=StopWatch("公众号Java技术栈:耗时测试");//开始计时sw.start("Task1");//休眠1秒Thread.sleep(1000);//停止计时sw.stop();//1002msSystem.out.printf("任务1耗时:%d%s.\n",sw.getLastTaskTimeMillis(),“多发性硬化症”);Spring中创建实例的方法是新的,启动计时,获取时间需要手动启动和停止。继续添加2个task:Thread.sleep(1000);sw.start("Task2");Thread.sleep(1100);sw.stop();//1100ms.System.out.printf("Task2Time-消耗:%d%s.\n",sw.getLastTaskTimeMillis(),"ms");sw.start("任务3");Thread.sleep(1200);sw.stop();//1203ms.System.out.printf("任务3耗时:%d%s.\n",sw.getLastTaskTimeMillis(),"ms");//3.309373456s.System.out.printf("任务数:%s,总耗时:%ss.\n",sw.getTaskCount(),sw.getTotalTimeSeconds());Spring的一个重要亮点就是支持格式化打印结果:System.out.println(sw.prettyPrint());看一下最终的输出:但是有一点不友好的是,格式化后的结果显示的是纳秒,不能修改。.下面分别看看commons-lang3和Spring的核心源码实现原理:其实都是利用JDK中的System系统类实现的,只是做了一系列的封装。综上所述,无论是commons-lang3工具包还是Spring框架中的StopWatch,都可以轻松完成多个任务的计时和总耗时。不要再使用耗时的人工计算方法了。如果起始分配错误,手动计算可能会导致错误。当然,以上两个StopWatch的功能远不止栈长介绍的那么简单。stackleader的介绍就够了,更多的可以深入研究。本文所有完整示例源码均已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!总结一下这两个计时工具的优缺点:1)commons-lang3中StopWatch的使用比Spring简单;2)commons-lang3中StopWatch的功能比Spring中的更加灵活和强大,支持暂停、恢复、重置等功能;3)Spring提供了各个子任务的名称,以及按照格式打印结果的功能,更好的进行多任务统计;综上所述,我个人比较推荐使用commons-lang3工具包Spring中的,更加灵活和强大。如果不想引入额外的包,也可以考虑Spring里面的,看你的系统需求。所以,千万不要用System.currentTimeMillis...统计很费时间,太低了,求大家赶紧分享转发,规范一下!好了,今天的分享就到这里。稍后栈长会分享更多有趣的Java技术和最新的技术资料。关注公众号Java技术栈第一时间推送。我也会分享主流的Java面试题和参考答案。全部搞定后在公众号后台回复关键词“面试”刷题。版权声明:本文为公众号《Java技术栈》原创。转载、引用本文内容请注明出处。抄袭、洗稿均属侵权投诉,后果自负,并保留追究法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!