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