Java有两个取时间戳的方法:System.currentTimeMillis()
和System.nanoTime()
,它们的使用场景是有区别的,当前网上一些文章对于这两个方法的性能讨论存在一些片面的描述,本文希望能给出一个简单的最终答案。
System.currentTimeMillis() 存在性能问题?
答案是否定的。
这两个方法性能差异取决于操作系统。
Windows:
在 Windows 下,System.currentTimeMillis()
比System.nanoTime()
要快很多,这是因为 Windows 系统为前者提供的只是一个缓存变量,而后者则是实时的去硬件底层获取计数。
所以如果你的生产环境是 Windows,请尽可能避免使用 System.nanoTime()。
Linux:
在 Linux 下,两者的执行耗时相差不大,不论是单线程还是多线程。
不同的虚拟机实现会带来性能差异
如今的云主机主要有 Xen 和 KVM 两种实现方式,网上有文章发现它们在取系统时间方面存在性能差异。
当我们的虚拟机用的是 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); }; Consumertesting = test -> { System.out.println("Single thread test:"); test.run(); System.out.println(THREAD_COUNT + " threads test:"); List 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,所以执行输出当中System.nanoTime()
明显非常慢。具体输出内容我就不放出来了,因为不具有参考价值,大多数生产环境用的是 Linux。
到此这篇关于关于Java 获取时间戳的方法的文章就介绍到这了,更多相关Java 获取时间戳内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:JVM中判定对象需要回收的方法
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?