java - 为什么连续两次调用同一方法会产生不同的执行时间?

标签 java benchmarking microbenchmark

这里是一个示例代码:

public class TestIO{
public static void main(String[] str){
    TestIO t = new TestIO();
    t.fOne();
    t.fTwo();
    t.fOne();
    t.fTwo();
}


public void fOne(){
    long t1, t2;
    t1 = System.nanoTime();
    int i = 10;
    int j = 10;
    int k = j*i;
    System.out.println(k);
    t2 = System.nanoTime();
    System.out.println("Time taken by 'fOne' ... " + (t2-t1));
}

public void fTwo(){
    long t1, t2;
    t1 = System.nanoTime();
    int i = 10;
    int j = 10;
    int k = j*i;
    System.out.println(k);
    t2 = System.nanoTime();
    System.out.println("Time taken by 'fTwo' ... " + (t2-t1));
}

}

这给出了以下输出: 100 “fOne”所花费的时间... 390273 100 “fTwo”所花费的时间... 118451 100 “fOne”所花费的时间... 53359 100 “fTwo”所花费的时间... 115936 按任意键继续 。 。 .

为什么第一次执行相同的方法比连续调用花费更多的时间(明显更多)?

我尝试向命令行提供-XX:CompileThreshold=1000000,但没有任何区别。

最佳答案

有几个原因。 JIT(Just In Time)编译器可能尚未运行。 JVM 可以针对不同的调用进行不同的优化。您正在测量耗时,因此您的计算机上可能正在运行 Java 之外的其他程序。处理器和 RAM 缓存在后续调用中可能是“热”的。

您确实需要进行多次调用(数千次)才能获得准确的每个方法执行时间。

关于java - 为什么连续两次调用同一方法会产生不同的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804620/

相关文章:

java - 两个通知之间的 onHandleIntent 中隐含的 Intent 不同

java - 在 sbt 中有效,但在原始 Java : after using `javac` to compile a . 类文件中无效,为什么 `java` 找不到它?

apache - 如何在 Windows 中运行 Apache 基准负载测试?

testing - 在 golang 中运行没有 "go test"的基准测试

java - 如何创建一个方法来测量执行一个方法所花费的时间

java - Weka - 如何在 Java 中使用分类器

java - 接口(interface)和覆盖接口(interface)的方法

linux - 如何让磁盘写入速度达到fio一样高?

c++ - 禁用优化后 quick-bench.com 上的基准测试速度要快得多

objective-c - Swift RC4 与 Objective-C RC4 性能对比