对两种方法进行基准测试导致第一个结果不准确

Benchmarking two methods lead to first result being inaccurate

我正在尝试针对此主要功能中的同一问题对两种不同的方法进行基准测试。但是,second 方法的第一个基准与其他结果有很大不同。

有时还有一个问题,对于 second 方法,经过的时间等于 0.0 ns,这对我来说很奇怪。

我缺少什么?

输出

Iterative Method    -   Elapsed time (µs)
                27.151
                26.895
                21.773
                28.432
                26.127
==================================================
Formula method      -   Elapsed time (µs)
                5.123
                1.281
                0.512
                0.513
                0.512

主要代码:

public static void main(String[] args)
{
    int testSize = 5;

    System.out.println("Iterative Method\t-\tElapsed time (µs)");
    for (int i = 0; i < testSize; i++)
    {
        long startTime = System.nanoTime();
        iterativeMethod();
        long estimatedTime = System.nanoTime() - startTime;

        System.out.println("\t\t\t\t" + estimatedTime/1000f);
    }
    System.out.println("==================================================");
    System.out.println("Formula method\t\t-\tElapsed time (µs)");
    for (int i = 0; i < testSize; i++)
    {
        long startTime = System.nanoTime();
        int foo = SumDivisibleBy(3) + SumDivisibleBy(5) - SumDivisibleBy(15);
        long estimatedTime = System.nanoTime() - startTime;

        System.out.println("\t\t\t\t" + estimatedTime/1000f);
    }
}

Java 编译器和 JVM 可以在很多方面扰乱您的代码,非常 很难获得正确的微基准测试。 例如,可能会删除循环,可能根本不会分配实例,可能会重新排序语句并删除锁等。

所以恐怕像这样一个简单的基准测试是完全无关紧要的,你不应该太认真地对待它的结果。

除非您知道如何打印生成的程序集并查看代码在运行时真正发生了什么,否则我建议您使用 JMH.

重写基准测试

JMH 是 Oracle 官方提供的基准测试框架,专门设计用于处理 JVM 异常情况并确保实际测量正确的东西。

它非常容易使用,所有主要的 IDE 都对它有某种支持。您可以找到 JMH 教程和资源 here.