点击关注公众号,利用碎片时间学习

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);};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。

来源:segmentfault.com/a/1190000041276485

推荐:最全的java面试题库PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

Java获取时间戳,System.currentTimeMillis() 和 System.nanoTime() 哪个更快?相关推荐

  1. 统计代码执行时间时,System.currentTimeMillis()与System.nanoTime()哪个更适合?

    目录 1.nanoTime是什么? 2.currentTimeMillis是什么? 3.nanoTime与currentTimeMillis在JDK中阐述 4.nanoTime与currentTime ...

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

    欢迎关注方志朋的博客,回复"666"获面试宝典 Java有两个取时间戳的方法:System.currentTimeMillis() 和 System.nanoTime(),它们的使 ...

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

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

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

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

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

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

  6. 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?

    转自:知乎 www.zhihu.com/question/52311366/answer/1300903 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/work ...

  7. Java里的 for (;;) 与 while (true),哪个更快?

    在JDK8u的jdk项目下做个很粗略的搜索: 并没有差多少. 其次,for (;;) 在Java中的来源.个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响.这些人不一定是自己以前写C习 ...

  8. java nanotime 重复_关于Java中System.currentTimeMillis和System.nanoTime的错误认识

    在Java里面,时间戳常用System.currentTimeMillis(),因为它可以方便地与Date/Calendar进行转 换,System.nanoTime到不是怎么常用(至少我没怎么用过) ...

  9. System.currentTimeMillis()和System.nanoTime()的区别

    System.currentTimeMillis() 返回的是1970 年 1 月 1 日午夜到目前的毫秒数,建议主要用于获取时间,而不要用于计时,因为在计时的过程中,时间可能受NTP(时间服务器)的 ...

  10. java获取时间戳有多少种方式,给我写出5种以上示例

    Java中获取时间戳的方式有很多种, 以下是几种常用的方法: 使用System.currentTimeMillis()方法: long timestamp= System.currentTimeMil ...

最新文章

  1. 大数加法分析及C语言实现(加数可为负数)
  2. pl/sql command window 初步接触
  3. Linux服务器程序编程的几个坎
  4. Navicat中怎样将SQLServer的表复制到MySql中
  5. SAP Spartacus PersistFocus Directive是采取怎样的数据结构来存储focus信息的
  6. Java Float类详解
  7. 端口数据[精通WindowsSocket网络开发-基于VC++实现]第二章——TCP/IP简介
  8. Android Studio 生成*.aar文件及使用方法
  9. HanLP: Han Language Processing
  10. T8 ADS1299开发板的默认设置
  11. 用上瘾模型来看:艾威学院
  12. ubuntu shell命令划重点
  13. 抢红包大战,你准备好了吗?
  14. POJ 1370 Gossiping 笔记
  15. 【电脑配置知识】显卡 GPU
  16. emacs org初学者指南
  17. linux上ftp和ns有什么区别,Linux下ftp使用及nfs网络文件系统
  18. 原生PHP上传图片并且裁剪图片生成推广海报
  19. 用计算机答题答案提交后能否改错,湘大职院计算机.VF复习参考题1+详细答案
  20. 物联网+阿里云+小程序开发的一些工具和方法总结

热门文章

  1. 物业小区管理系统源码
  2. 读《Unity 5.x 游戏开发指南》
  3. ascii码值为负数_C语言编程基础学习字符型数据的ASCII码值为何是负数?
  4. java计算机毕业设计基于web旅游网站的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
  5. 多种群粒子群 MATLAB,多种群粒子群算法怎么编码啊,楼主小白求大神指导
  6. 2016集训队论文吉如一
  7. 单片机初始化WIFI模块
  8. win10引导安卓x86_实用教程,教你如何安装Win10+安卓双系统
  9. CISA,CISM,CISSP证书区别及cisp,oscp,osce,che简介
  10. 如何避免由 Web 字体引起的布局偏移