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