Mesure du temps D'exécution Java, de l'utilisation de la mémoire et de la charge CPU pour un segment de code

Pour un segment particulier du code Java, je voudrais mesurer:

  • temps d'Exécution (le plus probable thread temps d'exécution)
  • l'utilisation de la Mémoire
  • la charge CPU (spécifiquement attribuable au segment de code)

Je suis un novice Java relatif et je ne suis pas familier avec la façon dont cela pourrait être réalisé. J'ai été référé à JMX , mais je ne suis pas sûr de savoir comment cela pourrait être utilisé, et JMX semble un peu "lourd" pour ce que je cherche à faire.

Idéalement, je voudrais une classe de mesure qui peut être dit ce que je voudrais mesurer, avec la possibilité d'appeler une méthode start() avant un segment de code et une méthode stop() après. Les métriques pertinentes seraient enregistrées dans un fichier que je spécifie.

Par exemple:

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-t-il un moyen standard/commun/conventionnel d'y parvenir en Java?

Ces mesures sont pour des comparaisons de performances ponctuelles, et donc je ne cherche pas processus de surveillance à long terme en production.

Je suis plus qu'heureux d'être référé à des tutoriels ou à des exemples externes et je ne m'attends pas à une réponse complète ici. Cela dit, si quelque chose d'aussi simple que ce qui précède peut être réalisé, un exemple réaliste descendrait très bien.

25
demandé sur Peter Mortensen 2008-11-19 17:28:40

3 réponses

Le profilage peut être une option plus facile car vous n'avez pas besoin de statistiques en production. Le profilage ne nécessite pas non plus de modification de code. VisualVM (qui est livré avec le JDK 1.6.06+) est un outil simple. Si vous voulez quelque chose de plus en profondeur, j'irais avec Eclipse TPTP, NetBeans profiler ou JProfiler(pay).

Si vous voulez écrire que vous possédez, considérez ce qui suit:

Des mesures simples comme le temps d'exécution peuvent être effectuées en "synchronisant" la section qui vous intéresse:

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

Vous pouvez utiliser une technique similaire pour surveiller la mémoire via l'Exécution.getRuntime ().*la mémoire() méthodes. Gardez à l'esprit que le suivi de l'utilisation de la mémoire dans un environnement collecté est plus délicat que la simple soustraction.

La charge CPU est difficile à mesurer en Java, je m'en tiens généralement au temps d'exécution et optimise les sections plus longues / répétitives

19
répondu basszero 2011-04-16 09:47:47

Avec le ThreadMXBean, vous pouvez obtenir L'utilisation du processeur des threads individuels et le temps cpu consommé plutôt que le temps écoulé, ce qui peut être utile.

Cependant, il est souvent plus simple d'utiliser un profileur car ce processus génère souvent beaucoup de données et vous avez besoin d'un bon outil de visualisation pour voir ce qui se passe.

J'utilise Yourkit car je trouve plus facile de résoudre les problèmes que d'autres profileurs j'ai utilisés. J'utilise également le HPROF intégré car cela peut vous donner une vue différente sur le profil de votre application (mais pas aussi utile)

5
répondu Peter Lawrey 2009-01-24 07:40:04

L'utilisation D'un profileur Java est la meilleure option et vous donnera toutes les informations dont vous avez besoin dans le code. à savoir les temps de réponse, les CallTraces de Thread, les Utilisations de la mémoire, etc

Je vais vous suggérer JENSOR, un profileur Java open source, pour sa facilité d'utilisation et ses faibles frais généraux sur le processeur. Vous pouvez le télécharger, Instrumenter le code et obtiendrez toutes les informations dont vous avez besoin sur votre code.

Vous pouvez le télécharger à partir de: http://jensor.sourceforge.net/

1
répondu M.N 2012-06-28 07:16:15