我的程序迭代给定的数据,我观察到一个奇怪的行为。算法处理的前几个样本表现出较慢的运行时间性能,但随后的样本和迭代运行几乎一致(运行时间比前几个样本/迭代运行时间相对较低)。算法的第一次迭代慢但后续的迭代运行良好
这是为什么?我甚至试图在迭代循环之外调用该函数作为热身函数调用,希望JVM能够优化代码,以便通过热身函数调用来实现。
// warm up function call
warpInfo = warp.getDTW(testSet.get(startIndex), trainSet.get(0), distFn, windowSize);
this.startTime = System.currentTimeMillis();
for(int i=startIndex; i<endIndex; i++) {
for(int j=0; j<trainSet.size(); j++) {
train = trainSet.get(j);
instStartTime = System.currentTimeMillis();
warpInfo = warp.getDTW(test, train, distFn, windowSize);
if(warpInfo.getWarpDistance()<bestDist) {
bestDist = warpInfo.getWarpDistance();
classPredicted = train.getTSClass();
}
instEndTime = System.currentTimeMillis();
instProcessingTime = instEndTime - instStartTime;
// record timiing and results here
}
// record other information here
}
你可以请你分享你的代码与一些数据?没有这些信息,我们甚至无法搜索答案。 – JFPicard 2015-03-30 17:51:08
JVM优化需要的不仅仅是一次调用来实际执行优化...... JVM将该循环看作热点并优化它 – 2015-03-30 17:51:37
因此,您认为在这种情况下预热呼叫是无用的吗?它不会对代码优化产生任何影响? – 2015-03-30 18:03:25