2010-12-02 15 views
0

Est-ce que quelqu'un connaît un bon moyen de profiler un algorithme de tri en Java (séquentiel et jointure de fourche)? car le temps d'exécution est trop court (taille de la liste de tri 5000.), System.nanoTime() ne semble pas fonctionner correctement.Profil java parallèle/tri séquentiel

Je prévois d'exécuter le même scénario de test plusieurs fois (1000) et de me débarrasser des 100 premiers résultats (éviter le problème du compilateur HotSpot) et faire une moyenne de temps d'exécution en utilisant System.nanoTime(). Une suggestion à ce sujet?

Merci beaucoup!

Puis-je faire de cette façon?

double count = 0; 
double start, end; 
for(int r = 0; r < warmup; r++) { 
    // do test 
} 
for(int t = 0; t < runs; t++){ 
    start = System.nanoTime(); 
    // do test 
    end = System.nanoTime(); 
    count += start - end; 
} 
double avg = count/avg 

Répondre

1

Je peux vous assurer que nanoTime() fonctionne et si vous voulez éviter le réchauffement des points d'accès, vous devez l'exécuter 10K fois. Vous devriez trouver qu'une sorte d'élément 5K est assez rapide et même que le test 1K n'est pas très bon. Vous devez écrire un test qui produit des résultats reproductibles. Si ce n'est pas le cas, c'est à vous de réparer le test parce que ce n'est pas très bon.

Je vous suggère de l'essayer et de voir quels résultats vous obtenez.

Sur un vieil ordinateur, une sorte de valeurs int aléatoires de 5K prend environ 500 us. Note: le tri d'un tableau trié ne vous donnera pas le même résultat. (donc vous ne pouvez pas trier le même tableau à chaque fois)

Un moyen simple d'exécuter un test un certain nombre de fois en ignorant les N premières exécutions est de faire.

long start = 0; 
for(int r = -warmup; r < runs; r++) { 
    if (r == 0) start = System.nanoTime(); 
    // do test 
} 
long avg = (System.nanoTime() - start)/runs; 
+0

Vous voulez dire 10K fois trier la même liste ou se débarrasser du premier résultat 10k courses? merci – Ang

+0

Le réchauffement peut prendre 10K itérations. Donc, vous devez faire plus que cela et jeter les premiers 10K. Cependant dans ce cas je suppose, vous obtiendrez assez proche de ce résultat après quelques 1000. Dans tous les cas, 10K prend environ 5 secondes. –

+0

Puis-je tester à l'aide de cette façon: – Ang

2

Si le temps réel est trop court pour être comparé, il n'est probablement pas utile de l'optimiser.

Si vous ne faites que trier des listes de 5000 éléments, il est probablement préférable d'opter pour la solution la plus simple plutôt que de l'optimiser prématurément. Si vos listes sont significativement plus grandes, vous devriez faire une analyse comparative sur ces grandes listes plutôt que sur les plus petites.

+0

Savez-vous un bon moyen si j'ai besoin de telles informations? merci – Ang

1

Commencez par trier une liste plus grande. Je dirais que 50 000 000 éléments sont plus raisonnables si vous essayez de comparer les périodes de référence.