2009-05-04 7 views
2

Tout d'abord, je dois admettre que ce sont des questions très basiques et primitives ... Je veux démontrer différents algorithmes en Java pour le tri et la recherche, et pour obtenir une valeur pour l'exécution. Il sont des questions que je ne peux pas résoudre:Java task runtime

  1. il y a Hotspot compilation - qui est une optimisation d'exécution que je dois désactiver (je suppose). Comment puis-je obtenir des valeurs de temps (secondes) pour les temps d'exécution? Commencer une minuterie avant l'exécution et l'arrêter après ... semble un peu primitif. Et l'objet timer lui-même consomme de l'exécution ... Je dois éviter cela.

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

Merci, Klaus

Répondre

1
  1. Utiliser -Xint Indicateur JVM. D'autres options peuvent être vues here.

  2. Utilisez l'API ThreadMXBean pour obtenir les temps processeur/utilisateur de votre thread. Un exemple peut être vu here.

5

Vous pouvez désactiver HotSpot avec -Xint sur la ligne de commande, pour obtenir un ordre de diminution de l'ampleur de la performance. Cependant, pourquoi ne voulez-vous pas mesurer la performance du monde réel? Différentes choses peuvent devenir des goulots d'étranglement lorsque vous compilez.

En général, pour microbenchmarks:

  • utilisation System.nanoTime pour obtenir une mesure du temps au début et à la fin
  • course pour un laps de temps raisonnable
  • faire la mesure un certain nombre de fois (il y a quelques « warm up »)
  • n'entrelacer pas des mesures de différents algorithmes
  • ne faites pas d'E/S dans le segment mesuré
  • utiliser le résultat (HotSpot peut complètement optimiser l'écart des opérations triviales)
  • le faire dans une situation réelle du monde (ou un cloae possible)
  • rappeler dual core est la norme, et plus de cœurs deviendront normaux
1

Utilisation System.nanoTime() consomme deux fois moins de 1 micro-seconde. Je suggère que vous fassiez n'importe quel benchmark pendant un certain nombre de secondes et que vous preniez une moyenne de sorte qu'une erreur de micro-seconde ne soit pas significative. Dans l'ensemble, je suggère de ne pas rendre les choses plus compliquées que vous le souhaitez.

Pour avoir un échauffement intégré, j'ignore souvent les 10 à 20% d'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);