欢迎关注方志朋的博客,回复”666“获面试宝典

Java有两个取时间戳的方法:System.currentTimeMillis() 和 System.nanoTime(),它们的使用场景是有区别的,当前网上一些文章对于这两个方法的性能讨论存在一些片面的描述,本文希望能给出一个简单的最终答案。

System.currentTimeMillis() 存在性能问题?

答案是否定的。

这两个方法性能差异取决于操作系统。

Windows:

在 Windows 下,System.currentTimeMillis() 比 System.nanoTime() 要快很多,这是因为 Windows 系统为前者提供的只是一个缓存变量,而后者则是实时的去硬件底层获取计数。

  • 参考1: https://stackoverflow.com/questions/5839152/why-do-system-nanotime-and-system-currenttimemillis-drift-apart-so-rapidly/5839267#5839267

  • 参考2: http://stas-blogspot.blogspot.com/2012/02/what-is-behind-systemnanotime.html

所以如果你的生产环境是 Windows,请尽可能避免使用 System.nanoTime()

Linux:

在 Linux 下,两者的执行耗时相差不大,不论是单线程还是多线程。

不同的虚拟机实现会带来性能差异

如今的云主机主要有 Xen 和 KVM 两种实现方式,网上有文章发现它们在取系统时间方面存在性能差异。

文章地址:https://www.javaadvent.com/2019/12/measuring-time-from-java-to-kernel-and-back.html

当你的虚拟机用的是 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 finishthreads.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。

来源 | https://segmentfault.com/blog/yidinghe

热门内容:
  • 这款IDEA插件刷爆了朋友圈,网友:这用起来有点酸爽~

  • 推荐一个 Java 接口快速开发框架

  • 面试官:有了 for 循环 为什么还要 forEach ?

  • 网传铁饭碗职业排名,公务员仅排第八!

  • 为什么 Java 中“1000==1000”为false,而”100==100“为true?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

关于Java 获取时间戳的方法,我和同事争论了半天相关推荐

  1. Java 获取时间戳的方法(详解)

    关注微信公众号了解更多 码出宇宙 01.System.currentTimeMillis() 存在性能问题? 02.不同的虚拟机实现会带来性能差异 03.需要写一个专门的类来提升 System.cur ...

  2. java 获取时间戳 的三种方法

    java 获取时间戳 的三种方法,效率依次递减 方法一 : System.currentTimeMillis(); 方法二: new Date().getTime(); 方法三: Calendar.g ...

  3. 时间戳 java_java中获取时间戳的方法

    在java开发过程中经常会遇到统计某一天或是某一个月的数据,因此常常需要获取截取数据的两个时间戳(比如统计今天的数据,则需要获取一个开始时间为今天零点以及一个结束时间为明天零点),然后根据数据相关的时 ...

  4. java获取文件大小的方法

    目前Java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.io.*中FileInputStream的ava ...

  5. java获取时间戳的三种方式比较

    文章目录 java获取时间戳的三种方式比较 java获取时间戳的三种方式比较 import java.util.Calendar; import java.util.Date; //不再推荐使用Dat ...

  6. linux java获取路径_linux中java获取路径的方法

    linux中java获取路径的方法 发布时间:2020-05-06 11:11:26 来源:亿速云 阅读:700 作者:小新 今天小编给大家分享的是linux中java获取路径的方法,相信很多人都不太 ...

  7. java获取文件名后缀方法

    Java是一种应用广泛的编程语言,可以通过多种方式来实现对文件的操作.如文件名后缀.文件扩展名等.今天我们来看下 Java是如何获取文件名后缀的吧! 1.打开一个空文件,将其复制到一个新的文件夹中. ...

  8. java获取当月1号 的时间chuo_java获取时间戳的方法

    JAVA 获取当前月的初始时间的时间戳 public static long getMonthFirstDay() { Calendar calendar = Calendar.getInstance ...

  9. Java获取时间戳方法比较

    Java获取当前时间戳有3种方法: //方法 A System.currentTimeMillis(); //方法 B Calendar.getInstance().getTimeInMillis() ...

最新文章

  1. 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 )
  2. 【计算理论】可判定性 ( 对角线方法 | 证明自然数集 N 与实数集 R 不存在一一对应关系 )
  3. npm的插件如何直接在html中使用,webpack插件之htmlWebpackPlugin
  4. 如果只看一篇文章弄懂Pfile与spfile,那么这篇就够了……
  5. 自己写的.Net(C#)代码×××
  6. java和线程相关的关键字有哪些_Java中有哪些机制来保证线程安全?synchronized关键字和volatile关键字...
  7. 华为nova7保密柜_华为nova8系列发布 Vlog视频旗舰3299元起
  8. lt;转载自刘佳ID:freedom0203和waretgt; C++中成员初始化列表的使用
  9. 用Ant来做一键部署
  10. jQuery特效:实现简易轮播图
  11. 理解FPS游戏中的矩阵方框透视自瞄
  12. css3D旋转立方体
  13. 大话西游服务器刚维护完几率,大话西游2玩家预约凌烟阁服务器瞬间成功,这算不算被几率...
  14. 动态桌面软件测试简历,动态壁纸软件横评
  15. C++ - 线程安全的std::cout
  16. 【仿真设计】仿真技术在智能制造中的作用;智能制造难点在模型,焦点在仿真;汽车行业CAE研究
  17. html中outline属性,css的outline属性的作用是什么
  18. CCNP精粹系列之二十九--发布bgp子网信息,推荐
  19. * web H5 网页 浏览器 蓝牙 Bluetooth
  20. NFC framework introduce(二)

热门文章

  1. Oracle发布开源的轻量级 Java 微服务框架 Helidon
  2. 爬虫与浏览器的区别,爬虫产生(出自简书)
  3. [转帖]什么是光纤的波长?看看有哪些是你不知道的!
  4. C#:CsvReader读取.CSV文件(转换成DataTable)
  5. java初学者笔记总结day9
  6. Ubuntu安装Flash视频插件
  7. openstack安装在虚拟机上重启之后无法启动问题
  8. C#模糊查询绑定datagridview
  9. [转载]MaxtoCode对.Net程序加密的原理及解密探讨三(实例解密)
  10. 【青少年编程】【二级】绘制图形