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

Java 算法的第一次迭代很慢,但后续迭代运行良好,java,performance,Java,Performance,我的程序迭代给定的数据,我观察到一个奇怪的行为。算法处理的前几个样本显示运行时性能较慢,但随后的样本和迭代几乎以一致的速度运行(并且运行时间比前几个样本/迭代相对较低) 为什么会这样?我甚至尝试在迭代循环之外调用该函数作为预热函数调用,希望如果JVM正在优化代码,它可以通过预热函数调用来实现这一点 // warm up function call warpInfo = warp.getDTW(testSet.get(startIndex), trainSet.get(0), distFn, wi

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

为什么会这样?我甚至尝试在迭代循环之外调用该函数作为预热函数调用,希望如果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
}
//预热函数调用
warpInfo=warp.getDTW(testSet.get(startIndex)、trainSet.get(0)、distFn、windowSize);
this.startTime=System.currentTimeMillis();

对于(int i=startIndex;i在搜索之后,我遇到了一些链接,它们可以在运行程序时指定
-XX:CompileThreshold=1
,告诉JVM在这么多函数调用之后编译代码。另请参阅。 在用我的程序执行测试运行后,我可以声明它解决了问题


**编辑:*根据Zarev的评论,我认为我将此作为回答是错误的。CompietThreshold标志只允许过早编译代码,因此它不会导致第一次迭代的运行时间延长,但实际上它可能会导致编译程序而不考虑细节。

能否与大家分享你的代码中有一些数据?如果没有这些信息,我们甚至无法搜索答案。JVM优化需要不止一个调用来实际执行优化…JVM将循环视为热点并对其进行优化。因此,你认为,在这种情况下,预热调用是没有用的?它不会对c产生任何影响ode优化?这根本不是问题。这只是JIT的工作方式。使用
-XX:CompileThreshold=1
你弊大于利(实际上一点好处都没有)。然后有一个JVM开关来尽快编译字节码,而不是前面提到的一个更好的选择。更快编译代码没有意义,因为这样会阻止JIT对其进行适当的分析和优化。您可以尝试使用
-XX:+tieredcomployment
来编译您的c关于几个步骤的颂歌