欢迎来到小居数码网-一家分享数码知识,生活小常识的网站,希望可以帮助到您。

当前位置:生活小常识 > 数码知识 >
优质

java时间取整(java取当前时间)

数码知识

周鑫译优秀作者

原创内容 来源:小居数码网 时间:2024-08-11 19:14:02 阅读() 收藏:52 分享:59

导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有950个文字,大小约为4KB,预计阅读时间3分钟。

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

java取当前时间

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:///20...

    当你的虚拟机用的是 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 calln",                    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 calln",                    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 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取当前时间)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。

    94%的朋友还想知道的:

    (253)个朋友认为回复得到帮助。

    部分文章信息来源于以及网友投稿,转载请说明出处。

    本文标题:java时间取整(java取当前时间):http://sjzlt.cn/shuma/154769.html

    猜你喜欢