溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中怎么計算一段程序的運行時間

發(fā)布時間:2023-03-01 11:33:59 來源:億速云 閱讀:155 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Java中怎么計算一段程序的運行時間”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

    Java計算一段程序的運行時間

    介紹了兩種方法,一種是毫秒級別的計算,另一種是更精確的納秒級別的計算。

    毫秒級別計算時間

            //初始時間
            long startTime = System.currentTimeMillis();
     
            /*要計算的程序部分*/
     
            //結(jié)束時間
            long endTime = System.currentTimeMillis();
            //打印
            System.out.println("程序運行時間:" + (endTime - startTime) + "ms");

    更精確的納秒

            long startTime_N=System.nanoTime();
            /*測試程序部分*/
            long endTime_N=System.nanoTime(); //獲取結(jié)束時間
            System.out.println("程序運行時間: "+(endTime_N-startTime_N)+"ns");

    Java程序運行時間統(tǒng)計

    寫代碼特別是完成一些對時間要求比較高的任務(wù)時,我們經(jīng)常需要統(tǒng)計程序運行時間。整體思路當(dāng)然很簡單,在程序開啟和結(jié)束后分別記錄當(dāng)前時間,兩者相減,就得到了程序運行時間。以下介紹一些常見方法,具體使用情況可以根據(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,而是啟動虛擬機時生成的一個固定時刻,每個虛擬機的生成的這個時間都是不同的。

    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,把一天精準地分為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)的一部分。可以用來方便地進行計時。

    首先添加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"); // 單位為毫秒

    “Java中怎么計算一段程序的運行時間”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI