Question

Tout d’abord, je dois admettre que ce sont des questions très élémentaires et primitives ... Je souhaite démontrer différents algorithmes en Java pour le tri et la recherche, ainsi que pour obtenir une valeur pour l’exécution. Il y a des problèmes que je ne peux pas résoudre:

  1. il y a la compilation Hotspot - qui est une optimisation de l'exécution que je dois désactiver (je suppose).

  2. Comment puis-je obtenir des valeurs temporelles (secondes) pour les temps d'exécution? Démarrer une minuterie avant l'exécution et l'arrêter après ... semble un peu primitif. Et l'objet timer lui-même consomme du temps d'exécution ... Il faut que je l'évite.

Y a-t-il quelque chose dans l’API Java que l’on pourrait utiliser pour résoudre ces problèmes?

Merci, Klaus

Était-ce utile?

La solution

  1. Utilisez -Xint indicateur JVM. Vous pouvez voir d’autres options ici .

  2. Utilisez le ThreadMXBean API permettant d'obtenir les temps CPU / utilisateur pour votre thread. Un exemple peut être vu ici .

Autres conseils

Vous pouvez désactiver HotSpot à l'aide de -Xint sur la ligne de commande pour obtenir un rendement de l'ordre de grandeur. Cependant, pourquoi ne voulez-vous pas mesurer les performances du monde réel? Différentes choses peuvent devenir des goulots d'étranglement lors de la compilation.

En règle générale, pour les micro-repères:

  • utilisez System.nanoTime pour obtenir une mesure de temps au début et à la fin
  • exécuter pendant un laps de temps raisonnable
  • effectuez la mesure plusieurs fois (il y a des "préchauffages")
  • n'entrelacez pas les mesures de différents algorithmes
  • ne faites aucune entrée / sortie dans le segment mesuré
  • utiliser le résultat (HotSpot peut optimiser complètement les opérations triviales)
  • faites-le dans une situation réelle (ou dans la mesure du possible)
  • rappelez-vous que le double cœur est la norme et que davantage de noyaux deviendront normaux

L'utilisation de System.nanoTime () à deux reprises consomme moins de 1 micro-seconde. Je suggère que vous exécutiez n'importe quel point de référence pendant un nombre de secondes et que vous preniez une moyenne afin qu'une erreur de micro-seconde ne soit pas significative.

Dans l'ensemble, je suggérerais de ne pas compliquer les choses plus que nécessaire.

Pour avoir un échauffement intégré, j'ignore souvent les 10% à 20% des premières itérations. Quelque chose comme

long start;
int count;
for(int i = -count / 5; i < count; i++) {
    if (count == 0) start = System.nanoTime();
    // do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top