2009-10-06 83 views
1

我正在尋找一種方法來測量我的Java代碼中不同方法的CPU使用情況。我知道這可以用JNI和C實現,但我不知道從哪裏開始...在Mac上的Java中的CPU使用情況

這樣做的目的是比較不同的算法,並提供定性結果。

+0

我不使用的是Mac,所以我不會把這個作爲一個答案,但(1)驗證是否內置剖析代理「HPROF 「存在(您可以用Google舉例),以及(2)查看NetBeans分析器是否工作。 – kdgregory 2009-10-06 11:29:23

回答

1

可能是最常見的方法是使用抽樣。 JVM提供工具來詢問所有線程(或您感興趣的線程)的當前堆棧跟蹤,以及它們已消耗多少CPU。所以你定期做這個。在每次調用時,如果一個線程位於您感興趣的方法內部,那麼假定自該方法內的最後一次輪詢以來,它已經花費了報告的CPU時間的一半。

如果此方法聽起來合適,稍後我寫了一些材料在Java 5 profiling facilities可能會幫助你。

Java 5還提供了一個Instrumentation框架,通過該框架,您可以在加載類時加載醫生類,以便在進入和退出給定方法時包含調用,因此您可以在該方法內測量CPU使用情況。然而,這對程序來說更復雜一些,因爲你需要在實際的類二進制文件被加載時進行處理。

+0

++如果在5個樣本中有2個樣本,你會發現它做了一些並不是真的必要的特殊事情,你找到了一塊金塊。如果你修復它,你可以期望在1/5和3/5之間縮短時間。 http://stackoverflow.com/questions/375913/what-c​​an-i-use-to-profile-c-code-in-linux/378024#378024 – 2009-11-17 17:37:16

+0

...雖然我鄙視諸如「多少一個方法消耗的CPU時間「,因爲我認爲真正重要的是一個方法負責的包含掛鐘時間,佔總時間的百分比,我認爲其中的語句的統計量更加重要。 – 2009-11-17 18:31:57

+0

是的,一致認爲,如果你實際上不需要區分CPU時間和掛鐘時間(有時你可能會這樣),那麼你甚至不需要擔心CPU的測量:你可以假設一種方法在堆棧頂部平均20個「蜱」中有1個大約需要20個時間。 – 2009-11-18 08:45:52

0

如果你想使用已有的分析工具之一,那麼你可以嘗試Shark

1

我不認爲你能真正識別CPU使用率下降到與廓線儀的電流範圍的方法級別。對於大多數方法來說,這很明顯(如果該方法是計算綁定的並且是單線程的,那麼它將使用受操作系統分配的100%的CPU)。

雖然您可能想要確定熱點(方法消耗的CPU比您預計的要多 - 或者可能更少?),並且我建議您在YourKit上查找易於配置的分析器。

如果沒有,請查看JVM性能分析界面(JVMPI),這可能會給您一些進一步的指示。

0

看一看的OperatingSystemMXBean也許你可以看看以前的東西和你的方法

long startProcessCpuTime = operatingSystemMXBean.getProcessCpuTime(); 
long endProcessCpuTime = operatingSystemMXBean.getProcessCpuTime(); 

後的Java6僅

1

Sun VisualVM集成在最近的JDK和它的profiling capabilities are explained here中。請注意,如果我正確理解this,它似乎需要一個相當新的OSX版本。
Netbeans擁有基本相同的配置機制,我不知道這是否有幫助。

0

我我不確定這是不是你想要的,但我已經使用jrat來分析過去體面的結果。

0

在不同的線程中調用您的方法,並測量執行給定過程之前和之後的時間增量。

以測量過程調用的時間:

ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true); 
    long threadTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();