Java中如何計(jì)算一段程序的運(yùn)行時(shí)間
Java計(jì)算一段程序的運(yùn)行時(shí)間
介紹了兩種方法,一種是毫秒級(jí)別的計(jì)算,另一種是更精確的納秒級(jí)別的計(jì)算。
毫秒級(jí)別計(jì)算時(shí)間
? ? ? ? //初始時(shí)間 ? ? ? ? long startTime = System.currentTimeMillis(); ? ? ? ? ? /*要計(jì)算的程序部分*/ ? ? ? ? ? //結(jié)束時(shí)間 ? ? ? ? long endTime = System.currentTimeMillis(); ? ? ? ? //打印 ? ? ? ? System.out.println("程序運(yùn)行時(shí)間:" + (endTime - startTime) + "ms");
更精確的納秒
? ? ? ? long startTime_N=System.nanoTime(); ? ? ? ? /*測(cè)試程序部分*/ ? ? ? ? long endTime_N=System.nanoTime(); //獲取結(jié)束時(shí)間 ? ? ? ? System.out.println("程序運(yùn)行時(shí)間: "+(endTime_N-startTime_N)+"ns");
Java程序運(yùn)行時(shí)間統(tǒng)計(jì)
寫(xiě)代碼特別是完成一些對(duì)時(shí)間要求比較高的任務(wù)時(shí),我們經(jīng)常需要統(tǒng)計(jì)程序運(yùn)行時(shí)間。整體思路當(dāng)然很簡(jiǎn)單,在程序開(kāi)啟和結(jié)束后分別記錄當(dāng)前時(shí)間,兩者相減,就得到了程序運(yùn)行時(shí)間。以下介紹一些常見(jiàn)方法,具體使用情況可以根據(jù)項(xiàng)目需要選擇。
簡(jiǎn)單方法
1.1 System.currentTimeMillis()
大家第一印象肯定想到的是System.currentTimeMillis()。沒(méi)錯(cuò)!這個(gè)可以用來(lái)做最簡(jiǎn)單的時(shí)間統(tǒng)計(jì)。
long start = System.currentTimeMillis(); // 業(yè)務(wù)邏輯代碼... long end = System.currentTimeMillis(); long timeElapsed = finish - end; // 單位為毫秒
System.currentTimeMillis()記錄的是系統(tǒng)當(dāng)前時(shí)間(Wall-clock Time)距離1970-1-1 00:00:00流逝的時(shí)間,單位是毫秒。系統(tǒng)當(dāng)前時(shí)間具體什么意思呢,就是你操作系統(tǒng)中的時(shí)間。currentTimeMillis()并不是精確到1ms,而是跟操作系統(tǒng)具體實(shí)現(xiàn)有關(guān)。使用這個(gè)方法會(huì)存在問(wèn)題,因?yàn)橄到y(tǒng)時(shí)間是可以隨時(shí)調(diào)節(jié)的。比如:
- 用戶手動(dòng)調(diào)節(jié)系統(tǒng)時(shí)間;
- 系統(tǒng)自動(dòng)根據(jù)時(shí)間服務(wù)器調(diào)節(jié)時(shí)間;
- 有些有冬令時(shí)、夏令時(shí)的地區(qū)會(huì)自動(dòng)調(diào)節(jié)時(shí)間;
- 閏秒(Leap seconds),這個(gè)閏秒曾經(jīng)導(dǎo)致很多系統(tǒng)掛掉。
所以這種方法如果用在開(kāi)發(fā)階段粗略估計(jì)時(shí)間是沒(méi)有問(wèn)題的,但是如果用到生產(chǎn)環(huán)境,就會(huì)存在很大的風(fēng)險(xiǎn)。
1.2 System.nanoTime()
nanoTime()與currentTimeMillis()正好相反,與系統(tǒng)時(shí)間完全無(wú)關(guān),目的也正是用來(lái)統(tǒng)計(jì)程序耗時(shí)的。nanoTime()記錄的是從某個(gè)固定的時(shí)刻起,到現(xiàn)在經(jīng)過(guò)了多少納秒。但是這個(gè)固定的時(shí)刻不是Unix時(shí)間戳的1970-1-1 00:00:00,而是啟動(dòng)虛擬機(jī)時(shí)生成的一個(gè)固定時(shí)刻,每個(gè)虛擬機(jī)的生成的這個(gè)時(shí)間都是不同的。
nanoTime()雖然精確到納秒,但事實(shí)并不是每納秒都跳動(dòng)一格,而是可能在3納秒之后,一下跳動(dòng)3格。不過(guò)可以保證的是至少能跟currentTimeMillis()一樣精確。
使用nanoTime()的統(tǒng)計(jì)方法跟currentTimeMillis()一樣,如下:
long start = System.nonoTime(); // 業(yè)務(wù)邏輯代碼... long end = System.nonoTime(); long timeElapsed = finish - end; // 單位為納秒
Java8以上
Java8以上定義了新的萬(wàn)年歷,基于Java epoch,把一天精準(zhǔn)地分為86400秒。使用新的Instant方法如下:
Instant start = Instant.now(); // 業(yè)務(wù)邏輯代碼... Instant end = Instant.now(); long timeElapsed = Duration.between(start, finish).toMillis(); // 單位為毫秒
第三方庫(kù)StopWatch
StopWatch是Apache Commons Lang庫(kù)內(nèi)的一部分??梢杂脕?lái)方便地進(jìn)行計(jì)時(shí)。
首先添加maven庫(kù):
<dependency> ? ? <groupId>org.apache.commons</groupId> ? ? <artifactId>commons-lang3</artifactId> ? ? <version>3.7</version> </dependency>
然后代碼中:
StopWatch watch = new StopWatch(); watch.start(); // 業(yè)務(wù)邏輯代碼... watch.stop(); System.out.println("Time Elapsed: " + watch.getTime() + "ms"); // 單位為毫秒
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法
- java獲取當(dāng)前時(shí)間和前一天日期(實(shí)現(xiàn)代碼)
- Java計(jì)算兩個(gè)程序運(yùn)行時(shí)間的實(shí)例
- Java計(jì)算程序代碼執(zhí)行時(shí)間的方法小結(jié)
- Java獲取當(dāng)前時(shí)間年月日的方法
- java 獲取當(dāng)前時(shí)間的三種方法
- Java 獲取當(dāng)前系統(tǒng)時(shí)間的三種方法
- 教你使用Java獲取當(dāng)前時(shí)間戳的詳細(xì)代碼
- Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間源碼詳解(超詳細(xì)!)
相關(guān)文章
Java 詳解循環(huán)屏障CyclicBarrier如何實(shí)現(xiàn)多線程分段等待執(zhí)行完成
CyclicBarrier是一個(gè)同步工具類,可以翻譯成循環(huán)屏障,也叫障礙器或同步屏障。CyclicBarrier內(nèi)部有一個(gè)計(jì)數(shù)器count,調(diào)用障礙器的await方法會(huì)使計(jì)數(shù)器count的值減一,當(dāng)計(jì)數(shù)器count的值為0時(shí),表明調(diào)用了await方法線程已經(jīng)達(dá)到了設(shè)置的數(shù)量2021-11-11springboot+vue+elementsUI實(shí)現(xiàn)分角色注冊(cè)登錄界面功能
這篇文章主要給大家介紹了關(guān)于springboot+vue+elementsUI實(shí)現(xiàn)分角色注冊(cè)登錄界面功能的相關(guān)資料,Spring?Boot和Vue.js是兩個(gè)非常流行的開(kāi)源框架,可以用來(lái)構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下2023-07-07java 方法重寫(xiě)與權(quán)限修飾符以及多態(tài)和抽象類詳解概念和用法
重寫(xiě)是子類對(duì)父類的允許訪問(wèn)的方法的實(shí)現(xiàn)過(guò)程進(jìn)行重新編寫(xiě), 返回值和形參都不能改變。即外殼不變,核心重寫(xiě),權(quán)限修飾符用于控制被修飾變量、方法、類的可見(jiàn)范圍,說(shuō)明了面向?qū)ο蟮姆庋b性,所以我們要適用他們盡可能的讓權(quán)限降到最低,從而安全性提高2021-10-10關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀
這篇文章主要介紹了關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀,SpringMVC是目前主流的Web?MVC框架之一,本文將分析SpringMVC的異常處理內(nèi)容,需要的朋友可以參考下2023-05-05解讀maven項(xiàng)目中Tomcat10與JSTL的問(wèn)題匯總(Debug親身經(jīng)歷)
這篇文章主要介紹了解讀maven項(xiàng)目中Tomcat10與JSTL的問(wèn)題匯總(Debug親身經(jīng)歷),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解
這篇文章主要介紹了SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個(gè)Controller增強(qiáng)器,可對(duì)controller進(jìn)行增強(qiáng)處理,需要的朋友可以參考下2023-10-10Java基礎(chǔ)之打印萬(wàn)年歷的簡(jiǎn)單實(shí)現(xiàn)(案例)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)之打印萬(wàn)年歷的簡(jiǎn)單實(shí)現(xiàn)(案例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07Spring加載properties文件的兩種方式實(shí)例詳解
這篇文章主要介紹了Spring加載properties文件的兩種方式,需要的朋友可以參考下2018-02-02