关于java 获取时间戳的方法-亚博电竞手机版

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

system.currenttimemillis() 存在性能问题?

答案是否定的。

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

windows:

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

  • 参考

所以如果你的生产环境是 windows,请尽可能避免使用 system.nanotime()。

linux:

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

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

如今的云主机主要有 xen 和 kvm 两种实现方式,网上有文章发现 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 testing = 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(threawww.cppcns.comd -> { 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 获取时间戳内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图