Измерение времени выполнения Java, использования памяти и загрузки процессора для сегмента кода - PullRequest
25 голосов
/ 19 ноября 2008

Для определенного сегмента кода Java я хотел бы измерить:

  • Время выполнения (наиболее вероятно время выполнения потока )
  • Использование памяти
  • загрузка процессора (в частности, для сегмента кода)

Я относительный новичок в Java и не знаю, как этого достичь. Меня упомянули JMX , однако я не уверен, как это можно использовать, и JMX выглядит немного «тяжело» для того, что я собираюсь сделать.

В идеале я хотел бы, чтобы какой-то класс измерений мог сказать, что я хотел бы измерить, с возможностью вызова метода start() до сегмента кода и метода stop() после. Соответствующие метрики будут записываться в указанный мной файл.

Например:

import com.example.metricLogger;

metricLogger logger = new metricLogger();

logger.setLogPath(pathToLogFile);
logger.monitor(executionTime);
logger.monitor(memoryUsage);
logger.monitor(cpuLoad);

logger.start();

/* Code to be measured */

logger.stop();

Существует ли какой-либо стандартный / общий / традиционный способ достижения этого в Java?

Такие измерения предназначены для одноразовых сравнений производительности, и поэтому я не ищу каких-либо производственных процессов долгосрочного мониторинга.

Я более чем рад, что меня отсылают к учебным пособиям или внешним примерам, и я не ожидаю полного ответа здесь. Тем не менее, если что-то столь простое, как приведенное выше, может быть достигнуто, реалистичный пример получится очень удачным.

Ответы [ 3 ]

19 голосов
/ 19 ноября 2008

Профилирование может быть проще, так как вам не нужна статистика производства. Профилирование также не требует модификации кода. VisualVM (который поставляется с JDK 1.6.06+) - это простой инструмент. Если вы хотите что-то более глубокое, я бы выбрал Eclipse TPTP, Netbeans Profiler или JProfiler (платно).

Если вы хотите написать свое, рассмотрите следующее:

Простые измерения, такие как время выполнения, можно выполнить путем «синхронизации» интересующего вас раздела:

long start = System.nanoTime(); // requires java 1.5
// Segment to monitor
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9;

Вы можете использовать похожую технику для мониторинга памяти с помощью методов Runtime.getRuntime (). * Memory (). Имейте в виду, что отслеживание использования памяти в среде сборки мусора сложнее, чем простое вычитание.

Нагрузка на процессор трудно измерить в Java, я обычно придерживаюсь времени выполнения и оптимизирую более длинные / повторяющиеся секции

5 голосов
/ 24 января 2009

С помощью ThreadMXBean вы можете получить информацию об использовании процессора отдельными потоками и затрачиваемом времени процессора, а не времени, что может быть полезно.

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

Я использую Yourkit, так как мне легче решать проблемы, которые использовались другими профилировщиками. Я также использую встроенный hprof, так как это может дать вам другое представление о профиле вашего приложения (но не так полезно)

1 голос
/ 19 ноября 2008

Использование Java Profiler - лучший вариант, и он даст вам всю необходимую информацию о коде. время отклика, потоки вызовов, использование памяти и т. д.

Я предложу вам JENSOR , Java Profiler с открытым исходным кодом, за его простоту использования и низкую нагрузку на процессор. Вы можете скачать его, установить код и получить всю необходимую информацию о вашем коде.

Вы можете скачать его с: http://jensor.sourceforge.net/

...