Подтвердить что ты не робот

Общее время метода в Java VisualVM

В Java VisualVM существует ли способ отобразить общее время метода, а не "само время"? (Последнее не особенно полезно, поскольку оно ничего не говорит о том, сколько времени на самом деле предпринимаются для выполнения.)

Если нет, существует ли отдельный автономный Java-профайлер, который вычисляет общее время метода?

4b9b3361

Ответ 1

Глядя на данные трассировки в представлении "моментальный снимок", вы можете видеть как общее, так и собственное время.

Нажмите кнопку "моментальный снимок", которая появится в таблице результатов. Это создаст новую вкладку, содержащую представление "Дерево вызовов", которое разбивает количество "я" и общее время. "Комбинированное" представление также предоставляет эту информацию, но разделяет пространство экрана с представлением "Горячие точки", которое похоже на стандартный профиль профилирования.

Снимки могут быть созданы из стандартных данных "Profiler" или "Sampler". Однако моментальные снимки "Профайлер" могут быть созданы только до закрытия приложения, в то время как "Sampler" могут быть созданы в любое время.

(приведенная выше информация основана на VisualVM 1.3.1)

Ответ 2

Просто сделайте снимок результатов профилирования. Вы получите время настенных часов, а также время от времени.

Ответ 3

Существует простой способ получить общее время выполнения программы как процент времени выполнения настенных часов (а не миллисекунды). Просто используйте ctrl-break, чтобы получить кучу stackshots, пока вы этого ждете. Доля их, содержащая рутину, составляет% времени. Точность зависит от количества выстрелов. Если вы просто ищете, где проблемы, вам не нужно точное измерение времени. Вот краткое описание того, как это работает.

Ответ 4

Я думаю, вы хотите узнать, сколько времени занимает выполнение каждого метода. Вы хотите использовать JETM для контроля производительности. Это даст вам время входа, время выхода и разницу во времени для каждого метода. Вы узнаете, какой метод занимает сколько времени.

Если вы используете Spring, тогда становится легко интегрировать JETM http://jetm.void.fm/howto/spring_2_x_integration.html

Ответ 5

вы можете использовать jprofiler или некоторые инструменты javaagent для отслеживания времени выполнения метода для вас. В github есть некоторые инструменты с открытым исходным кодом, такие как simpleAPM.

Ответ 6

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
        }
    }
}

Вывод: Начало: ср. 26 мая 17:24:18 EDT 2010 Окончание: ср. 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

Ответ 7

вы можете использовать

 long startTime = System.currentTimeMillis();

в начале

и

 long endTime = System.currentTimeMillis();

и, наконец, получить результат

 long result = endTime - startTime; //Note, part might be backwards, I don't
                                    //Remember