当前位置:网站首页>System. Currenttimemillis() and system Nanotime (), which is faster? Don't use it wrong!

System. Currenttimemillis() and system Nanotime (), which is faster? Don't use it wrong!

2022-07-04 16:36:00 Java technology stack

author : A fabricated belief
source :https://segmentfault.com/a/1190000041276485

Java There are two ways to get a timestamp :System.currentTimeMillis() and System.nanoTime(), Their usage scenarios are different , At present, some articles on the Internet have some one-sided descriptions about the performance of these two methods , This article hopes to give a simple final answer .

System.currentTimeMillis() There are performance issues ?

The answer is No . The performance difference between the two methods depends on the operating system .

Windows:

stay Windows Next ,System.currentTimeMillis() Than System.nanoTime() Much faster , This is because Windows The system only provides a cache variable for the former , The latter is to get the count from the bottom of the hardware in real time .

So if your production environment is Windows, Please avoid using System.nanoTime().

Linux:

stay Linux Next , There is little difference in the execution time between the two , Whether it's single threaded or multi-threaded .

Different virtual machine implementations can lead to performance differences

Today's cloud hosts mainly include Xen and KVM Two ways of implementation , Some articles on the Internet found that they have performance differences in taking system time .

When your virtual machine uses Xen when , Taking time will be KVM More than ten times . However, the above also provides solutions to such problems .

You need to write a special class to improve System.currentTimeMillis() Performance ?

Unwanted . That's painting a snake to add feet .

My test code

My test code is as follows , Without any dependency , It can be used directly javac Compile and run . Readers who are interested can try :

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

Because I'm using Windows, So in the execution output System.nanoTime() Obviously very slow .

I won't release the specific output content , Because it has no reference value , Most production environments use Linux.

Recent hot article recommends :

1.1,000+ Avenue Java Arrangement of interview questions and answers (2022 The latest version )

2. Explode !Java Xie Cheng is coming ...

3.Spring Boot 2.x course , It's too complete !

4. Don't write about the explosion on the screen , Try decorator mode , This is the elegant way !!

5.《Java Development Manual ( Song Mountain version )》 The latest release , Download it quickly !

I think it's good , Don't forget to like it + Forward !

原网站

版权声明
本文为[Java technology stack]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207041432433802.html