减少Java程序相同连续运行的执行时间

减少Java程序相同连续运行的执行时间,java,performance,time,Java,Performance,Time,背景:我的团队开发了一个Java程序,它接受文本作为输入,对其进行处理并显示结果。程序的每次运行都是无状态的,并且独立于其他运行。我们注意到,当在同一个文本上循环运行处理方法时,第一次运行的完成时间最长,下一次运行的完成时间越来越短,直到几十次运行后,执行时间稳定下来,这个值比初始运行时间低得多 我尝试测试这是否是任何程序的普遍现象,并尝试运行以下代码,其中包含嵌套循环,并测量内部循环所用的时间: String s = "abcefghijklmnopqrstuvwxyz"; int TIMES

背景:我的团队开发了一个Java程序,它接受文本作为输入,对其进行处理并显示结果。程序的每次运行都是无状态的,并且独立于其他运行。我们注意到,当在同一个文本上循环运行处理方法时,第一次运行的完成时间最长,下一次运行的完成时间越来越短,直到几十次运行后,执行时间稳定下来,这个值比初始运行时间低得多

我尝试测试这是否是任何程序的普遍现象,并尝试运行以下代码,其中包含嵌套循环,并测量内部循环所用的时间:

String s = "abcefghijklmnopqrstuvwxyz";
int TIMES = 10;
int INNER_TIMES = 1000000; 
long count = 0;     
for (int i = 0; i < TIMES; i++) {       
    long start = System.currentTimeMillis();
    for (int j = 0; j < INNER_TIMES; j++) {
        List<String> list = new ArrayList<>();
        list.add(s);
    }
    count++;
    long end = System.currentTimeMillis();          
    double time = (end - start) / 1000.0;
    System.out.println(count + ": " + time + " seconds");
}
我试过很多次,结果基本一致。内循环的第一次运行始终需要约0.035-0.036秒,从第四次运行开始,甚至在将时间增加到1000次时,也需要约0.008-0.01秒,某些例外情况除外


我和我的团队领导都对为什么会发生这种情况感到困惑。这是Java中已知的现象吗?一般来说,在软件方面?为什么软件在达到最佳性能之前需要预热

这里可能有多个因素在起作用:

第一次执行代码时,JIT编译器可能正在将Java字节码编译为本机代码,例如后续调用可能会更快,最有可能解释您看到的行为 本机代码可能由CPU缓存
我相信你可以关闭JIT-Djava.compiler=NONE来验证第一个理论,尽管我以前从未关闭过JIT,但这里可能有多种因素:

第一次执行代码时,JIT编译器可能正在将Java字节码编译为本机代码,例如后续调用可能会更快,最有可能解释您看到的行为 本机代码可能由CPU缓存
我相信您可以关闭JIT-Djava.compiler=NONE来验证第一个理论,尽管我以前从未关闭过JIT,这是Java应用程序的正常行为,这也意味着您不应该优化应用程序,除非使用探查器证明它存在瓶颈。JVM将通过在运行时对代码使用即时编译来提高代码的性能

您可以在此处找到有关JIT优化的更多信息:


除此之外,您正在对自己的代码进行非常简单的基准测试。我建议您阅读以增强代码评估的当前结果。我还建议使用Java平台专用的微基准测试框架。

这是Java应用程序的正常行为,这也意味着您不应该优化应用程序,除非通过使用探查器证明它存在瓶颈。JVM将通过在运行时对代码使用即时编译来提高代码的性能

您可以在此处找到有关JIT优化的更多信息:


除此之外,您正在对自己的代码进行非常简单的基准测试。我建议您阅读以增强代码评估的当前结果。我还建议使用Java平台专用的微基准测试框架。

其他人可能会给出详细的解释,但我听说重复代码可以以某种方式缓存,因此在几次运行后运行得更快。我认为,当JIT多次运行代码时,它会被编译,因此运行得更快。我想这就是你在这里所经历的!其他人可能会给出详细的解释,但我听说重复的代码可以以某种方式缓存,因此它在几次运行后运行得更快。我认为,当JIT多次运行代码时,它会被编译,因此运行得更快。我想这就是你在这里所经历的!关闭JIT的系统属性正确,另请参阅。关闭JIT的系统属性正确,另请参阅。
1: 0.036 seconds
2: 0.018 seconds
3: 0.016 seconds
4: 0.009 seconds
5: 0.01 seconds
6: 0.009 seconds
7: 0.02 seconds
8: 0.014 seconds
9: 0.009 seconds
10: 0.01 seconds