Java VisualVM中的总方法时间
在Java VisualVM中,有没有什么方法可以显示总的方法时间,而不是“自我时间”? (后者并不是特别有用,因为它没有告诉你有多less时间实际运行的方法。)
如果没有,有没有计算总方法时间的独立的免费Java分析器?
在“快照”视图中查看跟踪数据可以查看总时间和自我时间。
按关于结果表的“快照”button。 这将创build一个新的选项卡,其中包含一个“调用树”视图,打破自我与总时间。 “组合”视图还提供了这些信息,但将屏幕空间与“标准概览视图”类似的“热点”视图分开。
快照可以从标准的“Profiler”或“Sampler”数据创build。 但是,“Profiler”快照只能在应用程序closures之前创build,而“Sampler”则可以随时创build。
(以上信息基于VisualVM 1.3.1)
只需简要介绍性能分析结果。 你将获得挂钟时间以及在那里的自我时间。
有一个简单的方法来获得一个例程的总时间占挂钟执行时间的百分比(而不是毫秒)。 只要使用ctrl-break来获得一堆stackshots,而你正在等待它。 包含例程的部分是所花费的时间的百分比。 准确度取决于您拍摄的次数。 如果您只是在寻找问题所在,则不需要精确的时间测量。 这里是它的工作原理的简短解释。
我想你想知道每个方法执行需要多less时间。 你会想用JETM来监视性能。 这会给你入场时间,退出时间和每种方法的时间差。 你会发现哪种方法需要多less时间。
如果您使用的是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 } } }
输出:开始:周五5月26日17:24:18 EDT 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/
起源发布: 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