2011-10-16 34 views
6

街上的字是scala中的循環比while循環慢。使用hprof剖析scala for循環

慢:

for (i <- 0 until 10000) { 
    f(i) 
} 

快速:

var i = 0 
while (i < 10000) { 
    f(i) 
    i += 1 
} 

如何使用HPROF告訴是否for循環是在我的代碼的瓶頸?我使用-agentlib:hprof=cpu=samples來分析我的代碼,該方法在「CPU樣本」部分中是什麼?

我想知道我的優化工作在哪裏。循環是瓶頸嗎?

回答

3

我想你可能會有更多的運氣與專門的分析工具,如yourkitvisualvm

它們通常具有捕捉CPU採樣的接口,然後深入瞭解哪些調用消耗了大多數CPU週期。任何種類的

瓶頸會出現(如服用的CPU時間95%),然後,直到你看到你的(或庫)的方法是對這些熱點調用堆棧上,你可以深入。然後你可以看到是否包含循環。

2

將每個循環放在自己的方法中,然後比較方法所用的時間。並且使用足夠的迭代實際上需要一些時間(或者將其包裝在另一個循環中)。 10000次迭代應該需要幾微秒;這對於Profiler來衡量很難。嘗試10億次(或10k次迭代的10萬次迭代)。

此外,如果f(i)是昂貴的,這將花費比循環更多的時間。另外,如果f(i)實際上沒有做任何事情,它可能會完全被優化。所以確保它確實(例如,更新計數器,計算總和等)。