在Java VisualVM中,有没有办法显示总方法时间,而不是“自我时间”? (后者并不是特别有用,因为它没有告诉你任何方法实际运行的时间。)
如果没有,是否有任何独立的免费Java分析器可以计算总方法时间?
答案 0 :(得分:52)
在“快照”视图中查看跟踪数据,可以查看总时间和自身时间。
按下结果表中显示的“快照”按钮。这将创建一个新选项卡,其中包含一个“调用树”视图,该视图可以分解自我与总时间。 “组合”视图还提供此信息,但使用类似于标准概要分析视图的“热点”视图拆分屏幕空间。
可以从标准“Profiler”或“Sampler”数据创建快照。但是,“Profiler”快照只能在应用程序关闭之前创建,而“Sampler”快照可以随时创建。
(以上信息基于VisualVM 1.3.1)
答案 1 :(得分:7)
只需拍摄分析结果的快照。你将获得挂钟时间以及那里的自我时间。
答案 2 :(得分:1)
有一种简单的方法可以将例程的总时间作为挂钟执行时间(而不是毫秒)的百分比。在等待它时,只需使用ctrl-break来获取一堆stackshot。包含例程的部分是它所花费的时间的百分比。准确度取决于你拍摄的镜头数量。如果您只是在寻找问题所在,那么您就不需要精确的时间测量。 Here's a short explanation of how it works.
答案 3 :(得分:0)
我想你想知道每个方法执行需要多少时间。您可能希望使用JETM来监视性能。 这将为您提供每种方法的入口时间,退出时间和时间差。你会发现哪种方法花了多少时间。
如果您使用的是Spring,则可以轻松集成JETM http://jetm.void.fm/howto/spring_2_x_integration.html
答案 4 :(得分:0)
您可以使用jprofiler或一些javaagent工具来监视方法执行时间。在github上有一些开源工具,比如simpleAPM。
答案 5 :(得分:-1)
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 结束:2010年5月26日星期三17:24:20 EDT 2010
参考 http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read
http://www.csg.is.titech.ac.jp/~chiba/javassist/html/
Origin来自: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html
答案 6 :(得分:-3)
你可以使用
long startTime = System.currentTimeMillis();
开头
和
long endTime = System.currentTimeMillis();
最后得到结果
long result = endTime - startTime; //Note, part might be backwards, I don't
//Remember