2016-10-02 48 views
1

我只是試圖用jvisualvm來剖析一個相對簡單的java程序。結果有點奇怪:小四線方法的自我時間最多,比其他任何方法都多!奇怪的分析器結果

public class Hub 
    public void clock() { 
     for (int i = 0; i < cogs.length; i++) { 
      cogs[i].clock(cnt, i, this); 
     } 
     cnt++; 
    } 
} 

注意:在這種情況下,cogs.length是8!

這很奇怪,因爲Cog.clock方法相當大!唯一合理的解釋我能想出的事實是,大多數(在這種情況下,8 6)齒軌對象將處於「停止」狀態,這被逮住這樣的:

public class Cog 
    public void clock(int cnt, int cogid, Hub hub) { 
     if (state == State.STOP) 
      return; 
     //long code goes here 
    } 
} 

但是,這不應該」沒有那麼大的影響!這裏是證明一個畫面:

enter image description here

+0

你打了幾次'clock()'?代碼的其餘部分在哪裏? –

+0

我修改了Hub.clock和Cog.clock之間的區別。基本上,Hub.clock被無限循環調用,然後調用所有Cog對象的時鐘。 –

+0

我不太相信Profiler。測量影響執行並存在許多問題。如果總運行時間真的只有10毫秒,那麼你可以忘記它; JVM需要更多的來正確地優化一切。如果你沒有遇到速度問題,那麼你可以忽略它(認爲我也很好奇這裏是什麼東西)。否則,請進行較長時間的測量併發布結果。 – maaartinus

回答

0

剖析影響代碼,因爲它的儀器(修改),它的運行時間。您有12_000_000次調用,運行時間爲9_000毫秒,即每次調用大約750納秒,這是在儀表使其速度變慢之後,因此沒有可能更少的儀表。在每次調用的這種時候,我不會期望從分析器得到任何合理的結果,也不會對不同方法的結果進行比較,但很可能帶有更多調用的方法的得分會高於帶有更少調用的方法(如果大部分調用都是如此)只檢查狀態並退出)。您可以嘗試使用VisualVM採樣器,但我不確定它是否足夠準確。您可能會嘗試自己測量時間(使用System.nanoTime()),但即使這樣也不能保證提供亞微秒級的精度。