57

在 Java VisualVM 中,有没有办法显示总方法时间,而不是“自我时间”?(后者并不是特别有用,因为它没有告诉你方法实际运行需要多少时间。)

如果没有,是否有任何独立的免费 Java 分析器可以计算总方法时间?

4

7 回答 7

54

在“快照”视图中查看跟踪数据可以让您查看总时间和自身时间。

按出现在结果表周围的“快照”按钮。这将创建一个新选项卡,其中包含一个“调用树”视图,该视图分解了自我与总时间。“组合”视图也提供此信息,但使用类似于标准分析视图的“热点”视图分割屏幕空间。

可以从标准的“Profiler”或“Sampler”数据创建快照。但是,“Profiler”快照只能在应用程序关闭之前创建,而“Sampler”快照可以随时创建。

(以上信息基于VisualVM 1.3.1)

于 2010-12-13T21:29:25.450 回答
7

只需对分析结果进行快照即可。您将在那里获得挂钟时间和自拍时间。

于 2009-12-14T08:20:10.837 回答
1

有一种简单的方法可以将例程的总时间作为挂钟执行时间的百分比(而不是毫秒)。只需在等待时使用 ctrl-break 获取一堆堆栈快照。其中包含例程的部分是它所花费的时间百分比。准确性取决于您拍摄的次数。如果您只是在寻找问题所在,则不需要精确的时间测量。这是它如何工作的简短说明。

于 2009-12-12T04:14:54.967 回答
0

我想你想知道每个方法执行需要多少时间。您可能希望使用 JETM 来监控性能。这将为您提供每种方法的进入时间、退出时间和时间差。你会发现哪种方法需要多少时间。

如果您使用的是 Spring,那么集成 JETM 会变得很容易 http://jetm.void.fm/howto/spring_2_x_integration.html

于 2011-11-09T14:43:12.973 回答
0

您可以使用 jprofiler 或一些 javaagent 工具为您监控方法执行时间。github上有一些开源工具,如 simpleAPM。

于 2015-09-21T14:21:12.460 回答
-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 年 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

于 2010-06-27T22:37:02.843 回答
-4

你可以使用

 long startTime = System.currentTimeMillis();

一开始

 long endTime = System.currentTimeMillis();

最后得到结果

 long result = endTime - startTime; //Note, part might be backwards, I don't
                                    //Remember
于 2009-12-12T02:56:31.477 回答