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