最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年03月01日 10:45:59   作者:_碼農(nóng)耕地人  
這篇文章主要介紹了Java中如何計(jì)算一段程序的運(yùn)行時(shí)間問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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ì)

寫代碼特別是完成一些對(duì)時(shí)間要求比較高的任務(wù)時(shí),我們經(jīng)常需要統(tǒng)計(jì)程序運(yùn)行時(shí)間。整體思路當(dāng)然很簡(jiǎn)單,在程序開啟和結(jié)束后分別記錄當(dāng)前時(shí)間,兩者相減,就得到了程序運(yùn)行時(shí)間。以下介紹一些常見方法,具體使用情況可以根據(jù)項(xiàng)目需要選擇。

簡(jiǎn)單方法

1.1 System.currentTimeMillis()

大家第一印象肯定想到的是System.currentTimeMillis()。沒錯(cuò)!這個(gè)可以用來做最簡(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ì)存在問題,因?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)掛掉。

所以這種方法如果用在開發(fā)階段粗略估計(jì)時(shí)間是沒有問題的,但是如果用到生產(chǎn)環(huán)境,就會(huì)存在很大的風(fēng)險(xiǎn)。

1.2 System.nanoTime()

nanoTime()與currentTimeMillis()正好相反,與系統(tǒng)時(shí)間完全無關(guān),目的也正是用來統(tǒng)計(jì)程序耗時(shí)的。nanoTime()記錄的是從某個(gè)固定的時(shí)刻起,到現(xiàn)在經(jīng)過了多少納秒。但是這個(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格。不過可以保證的是至少能跟currentTimeMillis()一樣精確。

使用nanoTime()的統(tǒng)計(jì)方法跟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(); // 單位為毫秒

第三方庫(kù)StopWatch

StopWatch是Apache Commons Lang庫(kù)內(nèi)的一部分??梢杂脕矸奖愕剡M(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式原理與用法詳解

    Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式原理與用法詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式,簡(jiǎn)單說明了責(zé)任鏈模式的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)責(zé)任鏈模式的具體用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • 基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    這篇文章主要介紹了Spring?Boot?如何動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載,現(xiàn)項(xiàng)目有一個(gè)需求,期望通過在application.yml配置文件中設(shè)置一個(gè)開關(guān),來決定是否加載數(shù)據(jù)庫(kù),文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Java基礎(chǔ)之文件概述

    Java基礎(chǔ)之文件概述

    這篇文章主要介紹了Java基礎(chǔ)之文件概述,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • Java繼承的問題引導(dǎo)和測(cè)試代碼

    Java繼承的問題引導(dǎo)和測(cè)試代碼

    這篇文章主要介紹了Java繼承的問題引導(dǎo)和測(cè)試代碼,涉及繼承的概念,合成的語(yǔ)法等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2021-08-08
  • Springcloud服務(wù)注冊(cè)consul客戶端過程解析

    Springcloud服務(wù)注冊(cè)consul客戶端過程解析

    這篇文章主要介紹了Springcloud服務(wù)注冊(cè)consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java實(shí)現(xiàn)優(yōu)雅停止線程的有效方法詳解

    Java實(shí)現(xiàn)優(yōu)雅停止線程的有效方法詳解

    這篇文章主要為大家詳細(xì)如何安全有效停止 Java 線程的,確保多線程應(yīng)用程序平穩(wěn)運(yùn)行并實(shí)現(xiàn)最佳資源管理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 在springboot中如何使用線程池

    在springboot中如何使用線程池

    在SpringBoot中,可以通過定義ThreadPoolTaskExecutor的Bean并使用@Autowired注入來使用線程池,具體步驟包括創(chuàng)建ThreadPoolTaskExecutor的Bean配置,本文給大家介紹springboot使用線程池的例子,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Maven打jar包的三種方式(小結(jié))

    Maven打jar包的三種方式(小結(jié))

    這篇文章主要介紹了Maven打jar包的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述詳解

    Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述詳解

    這篇文章主要介紹了Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)

    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

最新評(píng)論

泾源县| 怀柔区| 砀山县| 朔州市| 响水县| 绿春县| 鹤山市| 新干县| 新和县| 都江堰市| 南京市| 泗阳县| 达拉特旗| 南京市| 利辛县| 普宁市| 汝阳县| 北川| 茌平县| 伊通| 漳平市| 合江县| 股票| 阿拉善右旗| 韶山市| 涞水县| 婺源县| 蚌埠市| 上饶县| 库车县| 淮阳县| 温泉县| 房山区| 广丰县| 堆龙德庆县| 龙陵县| 边坝县| 兴宁市| 运城市| 凉城县| 东源县|