web-dev-qa-db-fra.com

Quel est le meilleur outil / cadre de macro-analyse comparative pour mesurer un algorithme complexe à un seul thread en Java?

Je veux faire des mesures de performances (principalement le runtime) pour mon Java, un algorithme complexe local unique) (donc je ne veux pas de macro-benchmark pour mesurer une implémentation JVM .)

Avec l'outil, je voudrais

  • analyser la complexité, c'est-à-dire voir comment mon code évolue pour un paramètre n (la profondeur de recherche). (J'ai déjà un test junit paramétré en n.)
  • faites un peu analyse des tendances pour être averti si un changement dans la base de code rend le code plus lent.

Pour cela, je voudrais utiliser un outil ou un framework qui

  • fait le statistiques, calculant de manière optimale la valeur moyenne, l'écart type et les intervalles de confiance. C'est très important.
  • peut être paramétré (voir paramètre n ci-dessus). Ceci est également très important.
  • est capable de produire un complot de fantaisie serait Nice, mais n'est pas requis
  • peut être utilisé dans un test automatisé (junit-) pour m'avertir si mon programme ralentit, mais ce n'est pas non plus obligatoire, juste un plus.

Quels outils/cadres répondent à ces exigences? Lequel conviendrait le mieux à l'analyse de la complexité et des tendances, et pourquoi?

54
DaveFar

Voici une liste alphabétique de tous les outils que j'ai trouvés. Les aspects mentionnés sont:

  • est-il facilement paramétrable
  • est-ce une bibliothèque Java ou au moins facilement intégrable dans votre programme Java
  • peut-il gérer le micro-benchmarking JVM, par ex. utiliser une phase d'échauffement
  • peut-il tracer visuellement les résultats
  • peut-il stocker les valeurs mesurées de manière persistante
  • peut-il faire une analyse des tendances pour avertir qu'un nouveau commit a provoqué un ralentissement
  • fournit-il et utilise-t-il des statistiques (au moins max, min, moyenne et écart type).

Pilote automatique

paramétrable; Bibliothèque Perl; pas de micro-benchmarking JVM; traçage; persistance; analyse de tendance!?; bonnes statistiques (exécuter un test donné jusqu'à stabilisation des résultats; mettre en évidence les valeurs aberrantes).

Cadre d'analyse comparative

non paramétrable; Java; micro-benchmark JVM; pas de traçage; pas de persistance; pas d'analyse de tendance; statistiques.

Est-ce que les statistiques sont extrêmement bien: en plus de la moyenne, max, min et écart-type, il calcule également l'intervalle de confiance à 95% (via bootstrapping) et la corrélation série (par exemple pour avertir des temps d'exécution oscillants, qui peuvent se produire si votre programme se comporte de manière non déterministe, par exemple parce que vous utilisez des HashSets). Il décide de la fréquence à laquelle le programme doit être itéré pour obtenir des mesures précises et les interprète pour les rapports et les avertissements (par exemple sur les valeurs aberrantes et la corrélation en série).

Le micro-benchmarking fonctionne également très bien (voir Créer un benchmark rapide/fiable avec java? pour plus de détails).

Malheureusement, le framework est fourni dans un paquet util groupé avec de nombreuses autres classes d'assistance. Les classes de référence dépendent de JSci (une API scientifique pour Java) et de Mersenne Twister ( http://www.cs.gmu.edu/~sean/research/ ). Si l'auteur, Brent Boyer, trouve du temps, il réduira la bibliothèque et ajoutera un grapher plus simple pour que l'utilisateur puisse inspecter visuellement les mesures, par ex. pour les corrélations et les valeurs aberrantes.

Pied à coulisse

paramétrable; Java; micro-benchmark JVM; traçage; persistance; aucune analyse de tendance; statistiques.

Projet relativement nouveau, adapté aux applications Android. Apparemment jeune mais prometteur. Dépend de Google Guava :(

Surveillance commune

non paramétrable!?; Java; pas de micro-benchmark JVM!?; Traçage; persistance via un servlet; pas d'analyse de tendance!?; Pas de statistiques!?.

Prend en charge l'instrumentation AOP.

JAMon

non paramétrable; Java; pas de micro-benchmarking JVM; traçage, persistance et analyse des tendances avec des outils supplémentaires (Jarep ou JMX); statistiques.

Une bonne surveillance, entrelacée avec log4j, les données peuvent également être consultées ou interrogées par programme et votre programme peut prendre des mesures sur les résultats.

Java Simon

non paramétrable!?; Java; pas de micro-benchmarking JVM; traçage uniquement avec Jarep; persistance uniquement avec JMX; pas d'analyse de tendance; pas de statistiques!?.

Concurrent de Jamon, prend en charge une hiérarchie de moniteurs.

JETM

non paramétrable; Java; micro-benchmark JVM; traçage; persistance; pas d'analyse de tendance; pas de statistiques.

Bel outil de surveillance léger, pas de dépendances :) N'offre pas de statistiques suffisantes (pas d'écart type), et l'extension du plugin semble en conséquence assez difficile (les agrégateurs et les agrégats n'ont que des getters fixes pour min, max et moyenne).

jmeter

paramétrable!?; Java; pas de micro-benchmark JVM!?; Traçage; persistance; analyse de tendance!?; Statistiques!?.

Bonne bibliothèque de surveillance conçue pour les applications Web de test de charge.

Java Microbenchmark Harness (jmh)

paramétrable (invocateurs personnalisés via Java API); Java; JVM microbenchmarking; aucun tracé; aucune persistance; aucune analyse de tendance; statistiques).

Le harnais d'analyse comparative construit par les experts Oracle HotSpot, donc très approprié pour le micro-benchmarking sur HotSpot, utilisé dans le travail de performance OpenJDK. Des mesures extrêmes sont prises pour fournir un environnement de référence fiable. Outre une sortie lisible par l'homme, jmh fournit une API Java pour traiter les résultats, par exemple pour les traceurs tiers et les fournisseurs de persistance.

Junit-Benchmarks

paramétrable; Java; micro-benchmarking JVM; traçage; persistance (en utilisant CONSOLE, XML ou la base de données H2); analyse graphique des tendances; statistiques (max, min, moyenne, écart type; mais pas facilement extensible pour de plus amples informations) statistiques).

Ajoutez simplement une règle junit-4 à vos tests junit :)

junit-Benchmarks est open source, sous la licence Apache 2.

Mettre à jour: projet déplacé vers jmh

junitperf

Principalement pour faire une analyse des tendances pour les performances (avec le décorateur de test JUnit TimedTest) et l'évolutivité (avec le décorateur de test JUnit LoadTest).

paramétrable; Java; pas de micro-benchmarking JVM; pas de traçage; pas de persistance; pas de statistiques.

perf4j

non paramétrable; Java; pas de micro-benchmarking JVM; traçage; persistance via JMX; analyse des tendances via un appender log4j; statistiques.

S'appuie sur un cadre de journalisation, peut utiliser AOP.

Projet Broadway

Concept très général: les moniteurs observent des conditions prédéfinies et précisent comment réagir lorsqu'elles sont remplies.

speedy-mcbenchmark

L'accent est mis sur la paramétrisation: vérifiez si votre algorithme évolue, c'est-à-dire vérifiez s'il s'agit de O (n), O (n log (n)), O (n²) ...

Bibliothèque Java; Micro benchmarking JVM; pas de traçage; persistance; analyse de tendance; pas de statistiques.

The Grinder

paramétrable; Bibliothèque Jython; pas de micro-benchmarking JVM; traçage; persistance; aucune analyse des tendances; pas de bonnes statistiques, mais facilement extensible.

Dépend de Jython, HTTPClient, JEditSyntax, ApacheXMLBeans, PicoContainer.

TPTP

paramétrable!?; Java; pas de micro-benchmark JVM!?; Traçage; persistance; analyse graphique des tendances; pas de statistiques!?

La plate-forme d'outils de test et de performance est une énorme plate-forme générique et extensible (basée sur Eclipse et quatre EMF). Par conséquent, elle est puissante mais assez complexe, peut ralentir Eclipse et l'étendre pour vos propres besoins (par exemple avec des statistiques pour qu'ils influencent le nombre d'itérations) semblent être très difficiles.

semon

paramétrable!?; Java; pas de micro-benchmarking JVM; traçage; persistance; analyse des tendances!?; Statistiques!?.

L'outil est adapté à la surveillance dans les grands clusters.

67
DaveFar

Une autre alternative est caliper de google. Il permet test paramétré .

9
sbridges

Essayez d'utiliser http://labs.carrotsearch.com/junit-benchmarks.html . Il s'agit d'une extension de JUni4, avec:

Enregistre la moyenne du temps d'exécution et l'écart type.
Enregistrement de l'activité du ramasse-miettes.
Phase de préchauffage JVM par référence.
Génération de graphiques par exécution et historique.
Persistance facultative des résultats dans la base de données H2 SQL (interrogation avancée, analyse historique).

7
Ula Krukar