關于Java?獲取時間戳的方法
Java有兩個取時間戳的方法:System.currentTimeMillis()
和System.nanoTime()
,它們的使用場景是有區(qū)別的,當前網(wǎng)上一些文章對于這兩個方法的性能討論存在一些片面的描述,本文希望能給出一個簡單的最終答案。
System.currentTimeMillis() 存在性能問題?
答案是否定的。
這兩個方法性能差異取決于操作系統(tǒng)。
Windows:
在 Windows 下,System.currentTimeMillis()
比System.nanoTime()
要快很多,這是因為 Windows 系統(tǒng)為前者提供的只是一個緩存變量,而后者則是實時的去硬件底層獲取計數(shù)。
所以如果你的生產環(huán)境是 Windows,請盡可能避免使用 System.nanoTime()。
Linux:
在 Linux 下,兩者的執(zhí)行耗時相差不大,不論是單線程還是多線程。
不同的虛擬機實現(xiàn)會帶來性能差異
如今的云主機主要有 Xen 和 KVM 兩種實現(xiàn)方式,網(wǎng)上有文章發(fā)現(xiàn)它們在取系統(tǒng)時間方面存在性能差異。
當我們的虛擬機用的是 Xen 時,取時間的耗時會是 KVM 的十倍以上。不過上文也提供了遇到此類問題該如何解決的方案。
需要寫一個專門的類來提升 System.currentTimeMillis() 性能嗎?
不需要。那屬于畫蛇添足。
我的測試代碼
我的測試代碼如下,沒有任何依賴,可以直接用 javac 編譯然后運行。讀者有興趣可以試試。
import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class TimePerformance { public static final int LOOP_COUNT = 9999999; public static final int THREAD_COUNT = 30; public static void main(String[] args) { Runnable millisTest = () -> { long start = System.currentTimeMillis(); for (int i = 0; i < LOOP_COUNT; i++) { System.currentTimeMillis(); } long end = System.currentTimeMillis(); System.out.printf("%s : %f ns per call\n", Thread.currentThread().getName(), ((double)end - start) * 1000000 / LOOP_COUNT); }; Runnable nanoTest = () -> { long start = System.currentTimeMillis(); for (int i = 0; i < LOOP_COUNT; i++) { System.nanoTime(); } long end = System.currentTimeMillis(); System.out.printf("%s : %f ns per call\n", Thread.currentThread().getName(), ((double)end - start) * 1000000 / LOOP_COUNT); }; Consumer<Runnable> testing = test -> { System.out.println("Single thread test:"); test.run(); System.out.println(THREAD_COUNT + " threads test:"); List<Thread> threads = new ArrayList<>(); for (int i = 0; i < THREAD_COUNT; i++) { Thread t = new Thread(test); t.start(); threads.add(t); } // Wait for all threads to finish threads.forEach(thread -> { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } }); }; System.out.println(" Test System.nanoTime()"); testing.accept(nanoTest); System.out.println(" Test System.currentTimeMillis()"); testing.accept(millisTest); } }
因為我用的是 Windows,所以執(zhí)行輸出當中System.nanoTime()
明顯非常慢。具體輸出內容我就不放出來了,因為不具有參考價值,大多數(shù)生產環(huán)境用的是 Linux。
到此這篇關于關于Java 獲取時間戳的方法的文章就介紹到這了,更多相關Java 獲取時間戳內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
教你用Java Swing實現(xiàn)自助取款機系統(tǒng)
今天給大家?guī)淼氖顷P于JAVA的相關知識,文章圍繞著如何用Java Swing實現(xiàn)自助取款機系統(tǒng)展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06feign開啟日志Logger.Level?feignLoggerLevel()中Level爆紅的解決
這篇文章主要介紹了feign開啟日志Logger.Level?feignLoggerLevel()中Level爆紅的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot通過參數(shù)注解自動獲取當前用戶信息的方法
這篇文章主要介紹了SpringBoot通過參數(shù)注解自動獲取當前用戶信息的方法,文中使用HandlerMethodArgumentResolver 類來實現(xiàn)這個功能,并通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-03-03JavaWeb項目實現(xiàn)文件上傳動態(tài)顯示進度實例
本篇文章主要介紹了JavaWeb項目實現(xiàn)文件上傳動態(tài)顯示進度實例,具有一定的參考價值,有興趣的可以了解一下。2017-04-04