我在for循环中迭代一组对象,并且对于每个对象,在一个点上生成相同的图。我碰巧认识到第一个对象的图形生成总是比其他对象更长。
我想这是因为某种优化在第一次迭代后被识别出来。问题是我想比较对象的运行时,当然这些对象的运行时应基于相同的条件。
这是什么样的优化,可以禁用吗?
编辑:这是for循环中代码的缩写示例:
double startTime = System.currentTimeMillis();
Graph g = new Graph();
for (int entry : entries) {
graph.addVertex("v" + entry);
}
System.out.println("runtime: " + (System.currentTimeMillis() - startTime) / 1000.0);
编辑:以下是前几个循环的测量值:
runtime: 0.045
runtime: 0.001
runtime: 0.001
runtime: 0.002
runtime: 0.002
这可能是由于C1 / C2的优化。在解释器代码中运行将禁用优化。使用-Xint运行。请注意,在该模式下运行会对整个应用程序产生性能影响。
我使用-verbose:class
来显示ClassLoader活动。在第一次迭代中,有许多加载的类在此之后不会再次加载。正如@Juan所建议的那样,我现在只是放弃第一次迭代作为解决方法。之后,所有类都被加载,每次迭代都在相同的条件下运行。