更新時間:2022-08-11 11:43:20 來源:動力節(jié)點 瀏覽2304次
Java運行時間計算的方法是什么?現(xiàn)在動力節(jié)點小編為大家介紹一些在 Java 中執(zhí)行經(jīng)過時間計算的主要方法。對Java感興趣的小伙伴也可以關(guān)注一下Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,相信對大家的學(xué)習(xí)一定會有所幫助的。
我們從一個簡單但通常不正確的解決方案開始我們在 Java 中測量經(jīng)過時間的方法列表。首先,我們將展示一個如何執(zhí)行計算的快速示例,然后我們將解釋代碼:
長啟動=系統(tǒng)。當(dāng)前時間米利斯();// 一段時間過去了long end = System . 當(dāng)前時間米利斯();long elapsedTime =結(jié)束-開始;
在上面的示例中,我們使用“System.currentTimeMillis()”靜態(tài)方法。該方法返回一個 long 值,它指的是自 1970 年 1 月 1 日以來的毫秒數(shù),以 UTC 表示。那么,為什么這個解決方案有問題呢?
您從差異中得到的結(jié)果可能不準(zhǔn)確,因為該方法測量的是我們所說的“掛鐘時間”。這意味著它可能因多種原因而發(fā)生變化,包括系統(tǒng)時鐘甚至閏秒的變化。
因此,簡而言之,如果您需要高精度,則應(yīng)避免使用 currentTimeMillis() 方法來計算經(jīng)過時間。
現(xiàn)在讓我們看看另一種計算經(jīng)過時間的方法。我們將首先注意到該示例,然后對其進(jìn)行評論。
長啟動=系統(tǒng)。納米時間();// 一段時間過去了long end = System . 納米時間();long elapsedTime =結(jié)束-開始;
如您所見,代碼看起來很像前面示例中的代碼。唯一的區(qū)別是現(xiàn)在我們使用的是“nanoTime()”方法而不是“currentTimeMillis()”。那么,這兩種方法有什么區(qū)別呢?
第一個顯著的區(qū)別是“nanoTime()”,顧名思義,以納秒為單位返回結(jié)果。根據(jù)文檔,我們可以看到其返回值的來源是 JVM(Java 虛擬機(jī))的高分辨率時間源。
該文件還強調(diào)了其他一些重要事實。第一個是您只能使用這種方法來計算經(jīng)過的時間。換句話說,方法返回的值沒有意義,因為它與任何時間系統(tǒng)都沒有關(guān)系。
使用此方法時要記住的另一件重要事情是,雖然它提供納秒級精度,但不一定提供納秒級分辨率。這里的“分辨率”是指更新值的頻率。
最后,請記住該方法不是線程安全的。
現(xiàn)在,我們將通過介紹 Apache Commons Lang API 提供的 StopWatch 類將重點轉(zhuǎn)向庫。讓我們看一個簡單的例子:
秒表手表=新的秒表();
觀看。開始();// 調(diào)用你想要對
watch進(jìn)行基準(zhǔn)測試的方法。停止();長結(jié)果=觀看。獲取時間();
從上面的代碼可以看出,StopWatch 的使用非常簡單。您可以通過調(diào)用“start()”方法開始計時。然后你做你需要執(zhí)行的任何任務(wù)。之后,您就可以調(diào)用“stop()”,然后調(diào)用“getTime()”,它將返回以毫秒為單位的經(jīng)過時間。請記住,此類呈現(xiàn)時間耦合。例如,這意味著您不能停止尚未啟動的時鐘或啟動已經(jīng)運行的時鐘。嘗試這樣做將導(dǎo)致拋出異常。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743