【发布时间】:2014-04-22 17:31:36
【问题描述】:
背景:我的团队正在开发一个 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");
}
结果与我们在程序中注意到的相似:
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
我尝试运行了很多次,结果非常一致。内部循环的第一次运行总是需要大约 0.035-0.036 秒,从第 4 次开始(即使将 TIMES 增加到 1000)大约需要 0.008-0.01 秒(有一些例外)。
我和我的团队领导都对为什么会发生这种情况感到困惑。这是 Java 中的一个已知现象吗?一般在软件中?为什么软件在达到最佳性能之前似乎需要“预热”?
【问题讨论】:
-
其他人大概可以给出详细的解释,但是我听说重复的代码会以某种方式被缓存,所以运行几次后运行速度更快。
-
我认为,当 JIT 多次运行代码时,它会被编译,因此运行速度更快。我想这就是你在这里所经历的!
标签: java performance time