当前位置: 首页 > 后端技术 > Java

关于Java的时间戳方法的争议

时间:2023-04-01 21:20:48 Java

Java有两种时间戳方法:System.currentTimeMillis()和System.nanoTime(),它们的使用场景不同。该方法的性能讨论中存在一些片面的描述,本文希望能给出一个简单的最终答案。System.currentTimeMillis()是否有性能问题?答案是否定的。这两种方法之间的性能差异取决于操作系统。Windows:在Windows下,System.currentTimeMillis()比System.nanoTime()快很多,因为Windows系统只为前者提供一个缓存变量,而后者是实时从底层硬件获取计数。参考1:https://stackoverflow.com/a/5...参考2:http://stas-blogspot.blogspot...所以如果您的生产环境是Windows,请避免使用System.nanoTime()。Linux:在Linux下,无论是单线程还是多线程,两者的执行时间相差不大。不同的虚拟机实现会带来性能差异。现在的云主机主要有两种实现方式:Xen和KVM。网上一篇文章发现,它们在占用系统时间方面存在性能差异。文章地址:https://www.javaadvent.com/20...当你的虚拟机使用Xen时,fetch时间会是KVM的十倍以上。但是,上面也提供了如何解决此类问题的解决方案。需要编写专门的类来提高System.currentTimeMillis()的性能吗?不必要。那是多余的。我的测试代码我的测试代码如下,没有任何依赖,直接用javac编译运行即可。读者有兴趣可以试试:importjava.util.ArrayList;importjava.util.List;importjava.util.function.Consumer;publicclassTimePerformance{publicstaticfinalintLOOP_COUNT=9999999;publicstaticfinalintTHREAD_COUNT=30;publicstaticvoidmain(String[]args){RunnablemillisTest=()->{longstart=System.currentTimeMillis();for(inti=0;i{longstart=System.currentTimeMillis();for(inti=0;itesting=test->{System.out.println("Single线程测试:");test.run();System.out.println(THREAD_COUNT+"线程测试:");Listthreads=newArrayList<>();for(inti=0;i{try{thread.join();}catch(InterruptedExceptione){e.printStackTrace();}});};System.out.println("////测试System.nanoTime()");testing.accept(nanoTest);System.out.println("////测试系统m.currentTimeMillis()");testing.accept(millisTest);}}因为我用的是Windows,System.nanoTime()的执行输出明显很慢,具体输出内容我就不放了,因为没有参考对于它的价值,大多数生产环境都使用Linux。