Java - профилирование функций - PullRequest
0 голосов
/ 11 декабря 2018

У нас есть Java-программа.Я хотел бы отслеживать вход и возврат нескольких функций, вызывая соответствующие функции профилировщика для входа и возврата этих функций.

Отслеживание записи функции просто, поэтому не будет частью этого обсуждения.Тем не менее, возврат немного запутан, так как нам придется добавлять код профилировщика в каждую точку возврата и, следовательно, искать предложения, как лучше всего сделать, не загромождая код.

В C ++ это было легко, просто создать локальный экземпляр небольшого класса трассировки при входе в функцию, и конструктор и деструктор этого класса трассировки позаботятся о вызове функции профилировщика.Тем не менее, Java не имеет деструктора (финализация не будет работать), поэтому такой подход не может быть и речи.

Есть предложения / советы?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Если вы используете JDK 11 и хотите измерить время выполнения метода с очень низкими издержками, вы можете создать событие Flight Recorder.

@StackTrace(false)
static class StopWatch extends jdk.jfr.Event {
}

StopWatch s = new StopWatch();
try {
  s.begin();
  ...
} finally {
  s.commit();
}

Для записи запустите JVM с помощью:

java -XX:StartFlightRecording:filename=dump.jfr

и запись будет записана, когда JVM существует.Затем его можно открыть в JDK Mission Control.Тем не менее, добавление инструментов к горячим методам может исказить результаты, и выборка, как правило, является лучшим подходом, и в этом случае вы можете просто использовать Flight Recorder без добавления добавленного кода.

0 голосов
/ 11 декабря 2018

Используйте блок try / finally для всего тела метода:

// handle entry
try {
    // function body
} finally {
    // handle return
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...