在 Java VisualVM 中,有没有办法显示总方法时间,而不是“自我时间”?(后者并不是特别有用,因为它没有告诉你方法实际运行需要多少时间。)
如果没有,是否有任何独立的免费 Java 分析器可以计算总方法时间?
在“快照”视图中查看跟踪数据可以让您查看总时间和自身时间。
按出现在结果表周围的“快照”按钮。这将创建一个新选项卡,其中包含一个“调用树”视图,该视图分解了自我与总时间。“组合”视图也提供此信息,但使用类似于标准分析视图的“热点”视图分割屏幕空间。
可以从标准的“Profiler”或“Sampler”数据创建快照。但是,“Profiler”快照只能在应用程序关闭之前创建,而“Sampler”快照可以随时创建。
(以上信息基于VisualVM 1.3.1)
只需对分析结果进行快照即可。您将在那里获得挂钟时间和自拍时间。
有一种简单的方法可以将例程的总时间作为挂钟执行时间的百分比(而不是毫秒)。只需在等待时使用 ctrl-break 获取一堆堆栈快照。其中包含例程的部分是它所花费的时间百分比。准确性取决于您拍摄的次数。如果您只是在寻找问题所在,则不需要精确的时间测量。这是它如何工作的简短说明。
我想你想知道每个方法执行需要多少时间。您可能希望使用 JETM 来监控性能。这将为您提供每种方法的进入时间、退出时间和时间差。你会发现哪种方法需要多少时间。
如果您使用的是 Spring,那么集成 JETM 会变得很容易 http://jetm.void.fm/howto/spring_2_x_integration.html
您可以使用 jprofiler 或一些 javaagent 工具为您监控方法执行时间。github上有一些开源工具,如 simpleAPM。
JavaAssist 是一个类库,可以在不接触源代码的情况下操作您的 Java 字节码。让我们举一个测量执行方法所用时间的例子。
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