算法的第一次迭代很慢,但随后的迭代运行良好

时间:2015-03-30 17:49:07

标签: java performance

我的程序迭代了给定的数据,我发现了一个奇怪的行为。算法处理的前几个样本显示运行时间性能较慢,但随后的样本和迭代运行几乎一致(并且运行时间比前几个样本/迭代的运行时间相对较短)。

为什么会这样?我甚至试图在迭代循环之外调用函数作为一个预热函数调用,希望如果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
}

1 个答案:

答案 0 :(得分:0)

搜索之后,我遇到了一些链接SO Answer to a similar questionthis Java performance comparison,它们可以在运行程序时指定-XX:CompileThreshold=1,以告诉JVM在此之后编译代码很多函数调用。另请参阅Oracle Page。 在使用我的程序执行测试运行后,我可以说它解决了问题。

**编辑:**根据Zarev的评论,我说我把这个作为答案的错误。 CompieThreshold标志只允许过早编译代码,因此它不会导致第一次迭代的较大运行时间,但实际上它可能导致编译程序而不考虑细节。