
java程序運?時間統(tǒng)計
?、簡單?法
1.1 System.currentTimeMillis()
long start = System.currentTimeMillis();
// 業(yè)務(wù)邏輯代碼...
long end = System.currentTimeMillis();
long timeElapd = finish - end;// 單位為毫秒
System.currentTimeMillis()記錄的是系統(tǒng)當前時間(Wall-clock Time)距離1970-1-1 00:00:00流逝的時間,單位是毫秒。系統(tǒng)當前時間具體什么意思呢,就是你操作系統(tǒng)中的時間。currentTimeMillis()并不是精確到1ms,?是跟操作系統(tǒng)具體實現(xiàn)有關(guān)。使?這個?法會存在問題,因為系統(tǒng)時間是可以隨時調(diào)節(jié)的。?如:
?戶?動調(diào)節(jié)系統(tǒng)時間;
系統(tǒng)?動根據(jù)時間服務(wù)器調(diào)節(jié)時間;
有些有冬令時、夏令時的地區(qū)會?動調(diào)節(jié)時間;
閏秒(Leap conds),這個閏秒曾經(jīng)導致很多系統(tǒng)掛掉。
所以這種?法如果?在開發(fā)階段粗略估計時間是沒有問題的,但是如果?到?產(chǎn)環(huán)境,就會存在很?的風險。
1.2 System.nanoTime()
nanoTime()與currentTimeMillis()正好相反,與系統(tǒng)時間完全?關(guān),?的也正是?來統(tǒng)計程序耗時的。nanoTime()記錄的是從某個固定的時刻起,到現(xiàn)在經(jīng)過了多少納秒。但是這個固定的時刻不是Unix時間戳的1970-1-1 00:00:00,?是啟動虛擬機時?成的?個固定時刻,每個虛擬機的?成的這個時間都是不同的。
nanoTime()雖然精確到納秒,但事實并不是每納秒都跳動?格,?是可能在3納秒之后,?下跳動3格。不過可以保證的是?少能跟currentTimeMillis()?樣精確。
使?nanoTime()的統(tǒng)計?法跟currentTimeMillis()?樣,如下:
long start = Time();
// 業(yè)務(wù)邏輯代碼...
long end = Time();
long timeElapd = finish - end;// 單位為納秒
?、Java8以上
Java8以上定義了新的萬年歷,基于Java epoch,把?天精準地分為86400秒。使?新的Instant?法如下:
Instant start = w();
// 業(yè)務(wù)邏輯代碼...
Instant end = w();
long timeElapd = Duration.between(start, finish).toMillis();// 單位為毫秒
三、第三?庫StopWatch
StopWatch是Apache Commons Lang庫內(nèi)的?部分。可以?來?便地進?計時。
?先添加maven庫:
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
代碼:
StopWatch watch = new StopWatch();
watch.start();
// 業(yè)務(wù)邏輯代碼...
watch.stop();
System.out.println("Time Elapd: " + Time() + "ms"); // 單位為毫秒