Pergunta

Para um determinado segmento de código Java, eu gostaria de medir:

  • O tempo de execução (o mais provável tempo de execução de thread )
  • O uso de memória
  • carga da CPU (especificamente atribuível ao segmento de código)

Eu sou um novato Java relativa e não estou familiarizado com a forma como isso pode ser alcançado. Eu tenho referido JMX , no entanto eu não tenho certeza como isso pode ser usado, e JMX parece um pouco 'pesado' para o que eu estou procurando fazer.

Idealmente, eu gostaria alguma classe de medição que pode ser dito o que eu gostaria de medir, com a opção de chamar um método start() antes de um segmento de código e um método stop() depois. métricas relevantes seriam registrados em um arquivo especifico.

Por exemplo:

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();

Existe alguma maneira padrão / common / convencional de conseguir isso em Java?

Tais medições são para one-off comparações de desempenho, e por isso não estou à procura de qualquer in-produção processos de monitoramento de longo prazo.

Eu estou mais do que feliz de ser encaminhado para tutoriais ou exemplos externos e não esperar uma resposta completa aqui. Dito isto, se algo tão simples como o acima pode ser alcançado um exemplo realista cairia muito bem.

Foi útil?

Solução

Profiling pode ser uma opção mais fácil desde que você não precisa de estatísticas em-produção. Profiling também não requer modificação do código. VisualVM (que navios w / o JDK 1.6.06+) é uma ferramenta simples. Se você quiser algo mais em profundidade eu iria com Eclipse TPTP, Netbeans profiler, ou JProfiler (pagamento).

Se você quiser escrever você possui, considere o seguinte:

measurments simples como o tempo de execução pode ser feito por "clock" a seção que você está interessado em:

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

Você pode usar uma técnica semelhante à memória do monitor via Runtime.getRuntime (). * De memória () métodos. Tenha em mente que rastrear o uso de memória em um ambiente recolhida de lixo é mais complicado do que simples subtração.

carga da CPU é difícil de medir em Java, eu normalmente ficar com o tempo de execução e otimizar a mais / seções repetitivas

Outras dicas

Com a ThreadMXBean você pode obter o uso da CPU de threads individuais e tempo de CPU consumido ao invés de tempo decorrido que pode ser útil.

No entanto, seu frequentemente mais simples de usar um profiler como este processo muitas vezes gera uma grande quantidade de dados e você precisa de uma boa ferramenta de visualização para ver o que está acontecendo.

Eu uso YourKit como eu encontrá-lo mais fácil de resolver problemas que outros profilers que tenho usado. Eu também uso o hprof embutida, pois isso pode lhe dar uma visão diferente sobre o perfil do seu aplicativo (mas não tão útil)

Usando uma Java Profiler é a melhor opção e ele vai lhe dar toda a percepção de que você precisa para o código. viz Response Times, CallTraces Tópico, Memory utilizações, etc

Eu sugiro que você JENSOR , uma fonte aberta Java Profiler, por sua facilidade de uso e baixa gerais na CPU. Você pode baixá-lo, instrumento do código e irá obter todas as informações que você precisa sobre o seu código.

Você pode baixá-lo a partir de: http://jensor.sourceforge.net /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top