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

Java 对两种方法进行基准测试会导致第一个结果不准确,java,algorithm,benchmarking,Java,Algorithm,Benchmarking,我试图在这个主函数中为同一个问题测试两种不同的方法。然而,第二种方法的第一个基准与其他结果有很大不同 还有一个问题,有时第二种方法的运行时间等于0.0ns,这对我来说很奇怪 我错过了什么 输出 Iterative Method - Elapsed time (µs) 27.151 26.895 21.773 28.432 26.

我试图在这个主函数中为同一个问题测试两种不同的方法。然而,第二种方法的第一个基准与其他结果有很大不同

还有一个问题,有时第二种方法的运行时间等于0.0ns,这对我来说很奇怪

我错过了什么

输出

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);
    }
}
publicstaticvoidmain(字符串[]args)
{
int testSize=5;
System.out.println(“迭代法\t-\tElapsed time(µs)”;
对于(int i=0;i
Java编译器和JVM被允许以多种方式干扰代码,因此很难获得正确的微基准测试。 例如,循环可能被删除,实例可能根本不被分配,语句可能被重新排序,锁可能被省略,等等

所以我担心像这样一个简单的基准是完全不相关的,你不应该把它的结果看得太严重

除非您知道如何打印生成的程序集并了解代码在运行时的实际情况,否则我建议您使用重写基准测试

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


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

有关测量时间的信息,请使用
System.currentTimeMillis()
。原因是计算机从中获取可靠值所需的时间太长(以纳秒为单位)。不要编写自己的基准测试工具。改用JMH()之类的东西。