關(guān)于Java?獲取時(shí)間戳的方法
Java有兩個(gè)取時(shí)間戳的方法:System.currentTimeMillis()
和System.nanoTime()
,它們的使用場(chǎng)景是有區(qū)別的,當(dāng)前網(wǎng)上一些文章對(duì)于這兩個(gè)方法的性能討論存在一些片面的描述,本文希望能給出一個(gè)簡(jiǎn)單的最終答案。
System.currentTimeMillis() 存在性能問(wèn)題?
答案是否定的。
這兩個(gè)方法性能差異取決于操作系統(tǒng)。
Windows:
在 Windows 下,System.currentTimeMillis()
比System.nanoTime()
要快很多,這是因?yàn)?Windows 系統(tǒng)為前者提供的只是一個(gè)緩存變量,而后者則是實(shí)時(shí)的去硬件底層獲取計(jì)數(shù)。
所以如果你的生產(chǎn)環(huán)境是 Windows,請(qǐng)盡可能避免使用 System.nanoTime()。
Linux:
在 Linux 下,兩者的執(zhí)行耗時(shí)相差不大,不論是單線程還是多線程。
不同的虛擬機(jī)實(shí)現(xiàn)會(huì)帶來(lái)性能差異
如今的云主機(jī)主要有 Xen 和 KVM 兩種實(shí)現(xiàn)方式,網(wǎng)上有文章發(fā)現(xiàn)它們?cè)谌∠到y(tǒng)時(shí)間方面存在性能差異。
當(dāng)我們的虛擬機(jī)用的是 Xen 時(shí),取時(shí)間的耗時(shí)會(huì)是 KVM 的十倍以上。不過(guò)上文也提供了遇到此類問(wèn)題該如何解決的方案。
需要寫一個(gè)專門的類來(lái)提升 System.currentTimeMillis() 性能嗎?
不需要。那屬于畫蛇添足。
我的測(cè)試代碼
我的測(cè)試代碼如下,沒(méi)有任何依賴,可以直接用 javac 編譯然后運(yùn)行。讀者有興趣可以試試。
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); } }
因?yàn)槲矣玫氖?Windows,所以執(zhí)行輸出當(dāng)中System.nanoTime()
明顯非常慢。具體輸出內(nèi)容我就不放出來(lái)了,因?yàn)椴痪哂袇⒖純r(jià)值,大多數(shù)生產(chǎn)環(huán)境用的是 Linux。
到此這篇關(guān)于關(guān)于Java 獲取時(shí)間戳的方法的文章就介紹到這了,更多相關(guān)Java 獲取時(shí)間戳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你用Java Swing實(shí)現(xiàn)自助取款機(jī)系統(tǒng)
今天給大家?guī)?lái)的是關(guān)于JAVA的相關(guān)知識(shí),文章圍繞著如何用Java Swing實(shí)現(xiàn)自助取款機(jī)系統(tǒng)展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06feign開啟日志Logger.Level?feignLoggerLevel()中Level爆紅的解決
這篇文章主要介紹了feign開啟日志Logger.Level?feignLoggerLevel()中Level爆紅的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06jvm垃圾回收GC調(diào)優(yōu)基礎(chǔ)原理分析
談到調(diào)優(yōu),這一定是針對(duì)特定場(chǎng)景、特定目的的事情, 對(duì)于 GC 調(diào)優(yōu)來(lái)說(shuō),首先就需要清楚調(diào)優(yōu)的目標(biāo)是什么?從性能的角度看,通常關(guān)注三個(gè)方面,內(nèi)存占用(footprint)、延時(shí)(latency)和吞吐量(throughput)2022-01-01SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶信息的方法
這篇文章主要介紹了SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶信息的方法,文中使用HandlerMethodArgumentResolver 類來(lái)實(shí)現(xiàn)這個(gè)功能,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-03-03java四種訪問(wèn)權(quán)限實(shí)例分析
這篇文章主要介紹了java四種訪問(wèn)權(quán)限實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動(dòng)態(tài)顯示進(jìn)度實(shí)例
本篇文章主要介紹了JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動(dòng)態(tài)顯示進(jìn)度實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04