Java VisualVM で、「自己時間」ではなく合計メソッド時間を表示する方法はありますか? (後者は、メソッドの実行に実際にかかる時間について何も教えてくれないので、特に有用ではありません。)
そうでない場合、合計メソッド時間を計算するスタンドアロンの無料 Java プロファイラーはありますか?
「スナップショット」ビューでトレース データを見ると、合計時間と自己時間を確認できます。
結果の表について表示される「スナップショット」ボタンを押します。これにより、「コール ツリー」ビューを含む新しいタブが作成され、自己時間と合計時間の内訳が表示されます。「結合」ビューもこの情報を提供しますが、標準のプロファイリング ビューに似た「ホット スポット」ビューで画面スペースを分割します。
スナップショットは、標準の「プロファイラー」または「サンプラー」データから作成できます。ただし、「プロファイラー」スナップショットはアプリケーションを閉じる前にしか作成できませんが、「サンプラー」スナップショットはいつでも作成できます。
(上記の情報は、VisualVM 1.3.1 に基づいています)
プロファイリング結果のスナップショットを撮るだけです。そこには、実時間だけでなく実時間も表示されます。
ルーチンの合計時間を(ミリ秒ではなく)壁掛け時計の実行時間のパーセントとして取得する簡単な方法があります。ctrl-breakを使用して、待っている間に大量のスタックショットを取得します。ルーチンを含むそれらの割合は、それにかかる時間の割合です。精度は、撮影するショットの数によって異なります。問題がどこにあるかを探しているだけなら、正確な時間測定は必要ありません。これがどのように機能するかについての簡単な説明です。
各メソッドの実行にかかる時間を知りたいと思います。パフォーマンスを監視するには、JETM を使用する必要があります。これにより、各方法の入場時間、退場時間、および時差が得られます。どのメソッドにどれだけの時間がかかっているかがわかります。
Spring を使用している場合は、JETM http://jetm.void.fm/howto/spring_2_x_integration.htmlの統合が容易になります。
JavaAssist は、ソースに触れることなく Java Byte Code を操作するためのクラス ライブラリです。メソッドの実行時間を測定する例を見てみましょう。
public class Subject {
/**
* Timetaken for start & end of the method
*
* @throws InterruptedException
*/
public void method2() throws InterruptedException {
// Some business logic :)
Thread.sleep(2000);
}
}
の実行にかかった時間を測定するには、次のようにメソッドの開始と終了にコードを追加して をsubject.method2()
拡張できます。Subject.methods()
public class JavaAssist {
public static void main(String[] args) {
timeTaken();
}
public static void timeTaken() {
try {
ClassPool p = ClassPool.getDefault();
CtClass cc = p.get("Subject");
CtMethod meth2 = cc.getDeclaredMethod("method2");
meth2.insertBefore("System.out.println(\" Start : \"+new java.util.Date());");
meth2.insertAfter("System.out.println(\" End : \"+new java.util.Date());");
// cc.writeFile(".");
Class c = cc.toClass();
Subject s = (Subject) c.newInstance();
s.method2();
cc.detach();
} catch (Exception e) {
// suppressed
}
}
}
出力: 開始: 2010 年 5 月 26 日水曜日 17:24:18 EDT 終了: 2010 年 5 月 26 日水曜日 17:24:20 EDT
参考 http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read
http://www.csg.is.titech.ac.jp/~chiba/javassist/html/
元の投稿: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html
あなたは使用することができます
long startTime = System.currentTimeMillis();
最初に
と
long endTime = System.currentTimeMillis();
そして最後に結果を得るために
long result = endTime - startTime; //Note, part might be backwards, I don't
//Remember