我的程序迭代給定的數據,我觀察到一個奇怪的行爲。算法處理的前幾個樣本表現出較慢的運行時間性能,但隨後的樣本和迭代運行幾乎一致(運行時間比前幾個樣本/迭代運行時間相對較低)。算法的第一次迭代慢但後續的迭代運行良好
這是爲什麼?我甚至試圖在迭代循環之外調用該函數作爲熱身函數調用,希望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