Java中如何計算一段程序的運(yùn)行時間
Java計算一段程序的運(yùn)行時間
介紹了兩種方法,一種是毫秒級別的計算,另一種是更精確的納秒級別的計算。
毫秒級別計算時間
? ? ? ? //初始時間
? ? ? ? long startTime = System.currentTimeMillis();
?
? ? ? ? /*要計算的程序部分*/
?
? ? ? ? //結(jié)束時間
? ? ? ? long endTime = System.currentTimeMillis();
? ? ? ? //打印
? ? ? ? System.out.println("程序運(yùn)行時間:" + (endTime - startTime) + "ms");更精確的納秒
? ? ? ? long startTime_N=System.nanoTime();
? ? ? ? /*測試程序部分*/
? ? ? ? long endTime_N=System.nanoTime(); //獲取結(jié)束時間
? ? ? ? System.out.println("程序運(yùn)行時間: "+(endTime_N-startTime_N)+"ns");Java程序運(yùn)行時間統(tǒng)計
寫代碼特別是完成一些對時間要求比較高的任務(wù)時,我們經(jīng)常需要統(tǒng)計程序運(yùn)行時間。整體思路當(dāng)然很簡單,在程序開啟和結(jié)束后分別記錄當(dāng)前時間,兩者相減,就得到了程序運(yùn)行時間。以下介紹一些常見方法,具體使用情況可以根據(jù)項(xiàng)目需要選擇。
簡單方法
1.1 System.currentTimeMillis()
大家第一印象肯定想到的是System.currentTimeMillis()。沒錯!這個可以用來做最簡單的時間統(tǒng)計。
long start = System.currentTimeMillis(); // 業(yè)務(wù)邏輯代碼... long end = System.currentTimeMillis(); long timeElapsed = finish - end; // 單位為毫秒
System.currentTimeMillis()記錄的是系統(tǒng)當(dāng)前時間(Wall-clock Time)距離1970-1-1 00:00:00流逝的時間,單位是毫秒。系統(tǒng)當(dāng)前時間具體什么意思呢,就是你操作系統(tǒng)中的時間。currentTimeMillis()并不是精確到1ms,而是跟操作系統(tǒng)具體實(shí)現(xiàn)有關(guān)。使用這個方法會存在問題,因?yàn)橄到y(tǒng)時間是可以隨時調(diào)節(jié)的。比如:
- 用戶手動調(diào)節(jié)系統(tǒng)時間;
- 系統(tǒng)自動根據(jù)時間服務(wù)器調(diào)節(jié)時間;
- 有些有冬令時、夏令時的地區(qū)會自動調(diào)節(jié)時間;
- 閏秒(Leap seconds),這個閏秒曾經(jīng)導(dǎo)致很多系統(tǒng)掛掉。
所以這種方法如果用在開發(fā)階段粗略估計時間是沒有問題的,但是如果用到生產(chǎn)環(huán)境,就會存在很大的風(fēng)險。
1.2 System.nanoTime()
nanoTime()與currentTimeMillis()正好相反,與系統(tǒng)時間完全無關(guān),目的也正是用來統(tǒng)計程序耗時的。nanoTime()記錄的是從某個固定的時刻起,到現(xiàn)在經(jīng)過了多少納秒。但是這個固定的時刻不是Unix時間戳的1970-1-1 00:00:00,而是啟動虛擬機(jī)時生成的一個固定時刻,每個虛擬機(jī)的生成的這個時間都是不同的。
nanoTime()雖然精確到納秒,但事實(shí)并不是每納秒都跳動一格,而是可能在3納秒之后,一下跳動3格。不過可以保證的是至少能跟currentTimeMillis()一樣精確。
使用nanoTime()的統(tǒng)計方法跟currentTimeMillis()一樣,如下:
long start = System.nonoTime(); // 業(yè)務(wù)邏輯代碼... long end = System.nonoTime(); long timeElapsed = finish - end; // 單位為納秒
Java8以上
Java8以上定義了新的萬年歷,基于Java epoch,把一天精準(zhǔn)地分為86400秒。使用新的Instant方法如下:
Instant start = Instant.now(); // 業(yè)務(wù)邏輯代碼... Instant end = Instant.now(); long timeElapsed = Duration.between(start, finish).toMillis(); // 單位為毫秒
第三方庫StopWatch
StopWatch是Apache Commons Lang庫內(nèi)的一部分。可以用來方便地進(jìn)行計時。
首先添加maven庫:
<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é)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java經(jīng)典設(shè)計模式之責(zé)任鏈模式原理與用法詳解
這篇文章主要介紹了Java經(jīng)典設(shè)計模式之責(zé)任鏈模式,簡單說明了責(zé)任鏈模式的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)責(zé)任鏈模式的具體用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08
基于SpringBoot實(shí)現(xiàn)動態(tài)配置數(shù)據(jù)庫的加載
這篇文章主要介紹了Spring?Boot?如何動態(tài)配置數(shù)據(jù)庫的加載,現(xiàn)項(xiàng)目有一個需求,期望通過在application.yml配置文件中設(shè)置一個開關(guān),來決定是否加載數(shù)據(jù)庫,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-10-10
Springcloud服務(wù)注冊consul客戶端過程解析
這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
Java實(shí)現(xiàn)優(yōu)雅停止線程的有效方法詳解
這篇文章主要為大家詳細(xì)如何安全有效停止 Java 線程的,確保多線程應(yīng)用程序平穩(wěn)運(yùn)行并實(shí)現(xiàn)最佳資源管理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
Java運(yùn)行時數(shù)據(jù)區(qū)概述詳解
這篇文章主要介紹了Java運(yùn)行時數(shù)據(jù)區(qū)概述,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
服務(wù)網(wǎng)關(guān)是分布式架構(gòu)中不可缺少的組成部分,是外部網(wǎng)絡(luò)和內(nèi)部服務(wù)之間的屏障。這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)。一起跟隨小編過來看看吧2018-05-05

