欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中如何計算一段程序的運(yùn)行時間

 更新時間:2023年03月01日 10:45:59   作者:_碼農(nóng)耕地人  
這篇文章主要介紹了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ù)項目需要選擇。

簡單方法

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)具體實現(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 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()雖然精確到納秒,但事實并不是每納秒都跳動一格,而是可能在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)的一部分??梢杂脕矸奖愕剡M(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 詳解循環(huán)屏障CyclicBarrier如何實現(xiàn)多線程分段等待執(zhí)行完成

    Java 詳解循環(huán)屏障CyclicBarrier如何實現(xiàn)多線程分段等待執(zhí)行完成

    CyclicBarrier是一個同步工具類,可以翻譯成循環(huán)屏障,也叫障礙器或同步屏障。CyclicBarrier內(nèi)部有一個計數(shù)器count,調(diào)用障礙器的await方法會使計數(shù)器count的值減一,當(dāng)計數(shù)器count的值為0時,表明調(diào)用了await方法線程已經(jīng)達(dá)到了設(shè)置的數(shù)量
    2021-11-11
  • springboot+vue+elementsUI實現(xiàn)分角色注冊登錄界面功能

    springboot+vue+elementsUI實現(xiàn)分角色注冊登錄界面功能

    這篇文章主要給大家介紹了關(guān)于springboot+vue+elementsUI實現(xiàn)分角色注冊登錄界面功能的相關(guān)資料,Spring?Boot和Vue.js是兩個非常流行的開源框架,可以用來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下
    2023-07-07
  • java 方法重寫與權(quán)限修飾符以及多態(tài)和抽象類詳解概念和用法

    java 方法重寫與權(quán)限修飾符以及多態(tài)和抽象類詳解概念和用法

    重寫是子類對父類的允許訪問的方法的實現(xiàn)過程進(jìn)行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫,權(quán)限修飾符用于控制被修飾變量、方法、類的可見范圍,說明了面向?qū)ο蟮姆庋b性,所以我們要適用他們盡可能的讓權(quán)限降到最低,從而安全性提高
    2021-10-10
  • 詳解Spring的StringUtils踩坑記錄

    詳解Spring的StringUtils踩坑記錄

    這篇文章主要介紹了詳解Spring的StringUtils踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java冒泡排序和選擇排序詳解

    java冒泡排序和選擇排序詳解

    這篇文章主要介紹了java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • 關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀

    關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀

    這篇文章主要介紹了關(guān)于SpringMVC的異常處理機(jī)制詳細(xì)解讀,SpringMVC是目前主流的Web?MVC框架之一,本文將分析SpringMVC的異常處理內(nèi)容,需要的朋友可以參考下
    2023-05-05
  • 解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)

    解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)

    這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解

    SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解

    這篇文章主要介紹了SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個Controller增強(qiáng)器,可對controller進(jìn)行增強(qiáng)處理,需要的朋友可以參考下
    2023-10-10
  • Java基礎(chǔ)之打印萬年歷的簡單實現(xiàn)(案例)

    Java基礎(chǔ)之打印萬年歷的簡單實現(xiàn)(案例)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)之打印萬年歷的簡單實現(xiàn)(案例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Spring加載properties文件的兩種方式實例詳解

    Spring加載properties文件的兩種方式實例詳解

    這篇文章主要介紹了Spring加載properties文件的兩種方式,需要的朋友可以參考下
    2018-02-02

最新評論