我的程序迭代了给定的数据,我发现了一个奇怪的行为。算法处理的前几个样本显示运行时间性能较慢,但随后的样本和迭代运行几乎一致(并且运行时间比前几个样本/迭代的运行时间相对较短)。
为什么会这样?我甚至试图在迭代循环之外调用函数作为一个预热函数调用,希望如果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
}
答案 0 :(得分:0)
搜索之后,我遇到了一些链接SO Answer to a similar question和this Java performance comparison,它们可以在运行程序时指定-XX:CompileThreshold=1
,以告诉JVM在此之后编译代码很多函数调用。另请参阅Oracle Page。
在使用我的程序执行测试运行后,我可以说它解决了问题。
**编辑:**根据Zarev的评论,我说我把这个作为答案的错误。 CompieThreshold标志只允许过早编译代码,因此它不会导致第一次迭代的较大运行时间,但实际上它可能导致编译程序而不考虑细节。