测试System.currentTimeMillis()与System.nanoTime()性能

105 阅读1分钟
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> timeTest = new Consumer<Runnable>() {
            List<Thread> threads = new ArrayList<>();
            @Override
            public void accept(Runnable runnable) {
                for (int i = 0; i < THREAD_COUNT; i++) {
                    Thread thread = new Thread(runnable);
                    thread.start();
                    threads.add(thread);
                }
                threads.forEach(thread -> {
                    try {
                        thread.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
            }
        };

        System.out.println("//// Test System.nanoTime()");
        timeTest.accept(nanoTest);
        System.out.println("//// Test System.currentTimeMillis()");
        timeTest.accept(millisTest);
    }
}