有兩種方法可以通過使用System.currentTimeinMillis()或通過使用System.nanoTime() 來測量Java中經過的執行時間 。 這兩個方法可用于測量 Java中兩個方法調用或事件之間的經過時間或執行時間 。 計算經過的時間是Java程序員要做的第一件事,即弄清方法要執行多少秒或毫秒,或者某個特定代碼塊要花費多少時間。 大多數Java程序員從一開始就熟悉System.currentTimeInMillis(),而Java 1.5引入了新版本的更精確的時間測量實用程序System.nanoTime,以及諸如Generics , Enum類型 ,auto等語言的一些新功能。裝箱和可變參數或可變參數 。 您可以使用它們中的任何一個來衡量Java中方法的執行時間。 盡管最好使用System.nanoTime()來更精確地測量時間間隔。
在本Java編程教程中,我們將看到一個簡單的Java程序,它通過使用System.nanoTime()和Spring框架的StopWatch實用工具類來測量執行時間。 本文是我繼續發布有關涵蓋Java基本概念的文章的繼續,例如如何在Java中比較String , 如何在Java中正確編寫equals方法以及在Java 中循環HashMap的4種方法 。 如果您還沒有閱讀它們,您可能會發現它們很有用。
這是一個使用System.nanoTime 測量兩個代碼塊之間的經過時間的代碼示例,在任何開放源代碼Java庫(如Apache commons lang,Google commons和Spring)中,還提供了StopWatch實用程序類,可用于測量Java的經過時間 。 StopWatch改進了可讀性,以在計算經過的執行時間時最大程度地減少了計算錯誤,但是請注意StopWatch并非線程安全的 ,不應在多線程環境中共享,并且它的文檔明確指出,它更適合用于基本性能評估的開發和測試環境在生產環境中執行時間計算。
import org.springframework.util.StopWatch;/*** Simple Java Program to measure elapsed execution time in Java* This Java Program shows two ways for measuring time in Java, by using System.nanoTime() which was* added in Java 5 and StopWatch which is a utility class from Spring Framework.*/
public class MeasureTimeExampleJava {public static void main(String args[]) {//measuring elapsed time using System.nanoTimelong startTime = System.nanoTime();for(int i=0; i < 1000000; i++){Object obj = new Object();}long elapsedTime = System.nanoTime() - startTime;System.out.println("Total execution time to create 1000K objects in Java in millis: "+ elapsedTime/1000000);//measuring elapsed time using Spring StopWatchStopWatch watch = new StopWatch();watch.start();for(int i=0; i < 1000000; i++){Object obj = new Object();}watch.stop();System.out.println("Total execution time to create 1000K objects in Java using StopWatch in millis: "+ watch.getTotalTimeMillis());} }Output:
Total execution time to create 1000K objects in Java in millis: 18
Total execution time to create 1000K objects in Java using StopWatch in millis: 15
您應該使用哪一個來衡量Java中的執行時間
如果您使用的版本低于JDK 1.5,則取決于可用的選項,而System.currentTimeInMillis()在可用性方面是最佳選擇,而在JDK 1.5之后,nanoTime可以更好地測量經過時間,因為它更準確并且使用精確的系統時鐘并可以測量高達納秒的精度 。 雖然如果您正在使用上述Java開源庫中的任何一個,大多數情況下使用Spring而不是StopWatch也是更好的選擇,但是正如我之前所說, StopWatch 不是線程安全的 ,只能在開發和測試環境中使用。 就像SimpleDateFormat不是線程安全的一樣 ,您可以使用ThreadLocal為每個線程創建SimpleDateFormat,您也可以使用StopWatch做同樣的事情。 但是我不認為StopWatch是像SimpleDateFormat這樣的重對象。
這就是如何測量Java的經過時間或執行時間的全部內容。 使自己養成測量重要代碼段的性能和執行時間的習慣,尤其是在大多數時間執行的方法或循環。 在那些地方,對代碼進行小的優化可以提高性能。
參考: 如何在Java中測量經過的執行時間–來自我們JCG合作伙伴 Javin Paul的StopWatch示例,來自Javarevisited博客。
翻譯自: https://www.javacodegeeks.com/2012/08/measure-execution-time-in-java-spring.html