2010-12-03 13 views
7

Si je suis en train de concevoir un test sur l'algorithme de tri, est-ce que je peux faire ainsi pour éviter le réchauffement JVM? Je vous remercie!Avoid jvm warmup

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 
+2

Essayez-vous encore d'évaluer un tri par 5 000 éléments ou avez-vous décidé de suivre les conseils donnés dans votre question précédente? Et si vous avez décidé de suivre ce conseil, vous devez accepter l'une des réponses. – Anon

+0

Merci Anon, je vais le faire – Ang

Répondre

5

Le warm-up de machine virtuelle Java se réfère généralement au temps qu'il faut pour la machine virtuelle Java pour trouver les points chauds et JIT ces sections du code. Si vous exécutez vos tests réels quelques centaines (en fait quelques milliers je crois) fois vous devriez être assez bon à faire.

Vous devriez cependant savoir que, même si vous faites cela, il n'y a aucune garantie. Vous devrez expérimenter avec votre JVM particulière pour déterminer combien de travail vous avez à faire avant que les parties vitales ne soient JITed et ainsi de suite.


En this little case study la compilation JIT donné le coup après 1700 appels.

+0

Uhm. mais si la boucle exécute réellement le test de tri ?! –

+0

Ah, désolé. Je n'ai pas réalisé que vous avez réellement exécuté les tests dans la boucle initiale. Oui, cela devrait mieux fonctionner. Je vais mettre à jour ma réponse. – aioobe

0

Oui. Comme la boucle d'échauffement exécute le test proprement dit, cela signifie que toutes les classes auront été chargées et que les compilations JIT auraient dû être exécutées.

3

Si je conçois un test sur l'algorithme de tri, est-ce que je peux faire ainsi pour éviter le réchauffement JVM?

Certains pedantry d'abord. Vous ne devriez pas éviter réchauffement JVM. Cela doit arriver. Ce que vous essayez de faire est d'empêcher le réchauffement JVM de déformer vos résultats de référence.

Pour répondre à votre question, l'approche est à peu près juste, mais il est très difficile de prédire combien de fois vous devez faire le test dans la boucle initiale. Cela dépendra probablement du code de test, de la version JVM et du paramètre de réglage JVM ... et probablement d'autres choses en plus. Ce que je fais habituellement est juste d'imprimer les timings bruts, de filtrer les itérations initiales de «réchauffement» qui semblent avoir des valeurs temporelles anormales «par oeil», et puis de calculer les moyennes à la main. C'est maladroit, mais cela me donne une certaine confiance que j'ai pris en compte le réchauffement et d'autres sources possibles d'anomalies.

2

C'est un très grand, mais voici quelques conseils:

1) assurer que votre test complet (y compris la boucle d'itération) est dans un sous-programme qui est invoqué à plusieurs reprises. Donc, votre test a la boucle for() dans la méthode "parent". poussez-le vers un "enfant" et invoquez cela à plusieurs reprises. Cela permet aux différentes technologies JIT de vraiment faire une optimisation complète sans avoir à remplacer le code en vol (dynamic loop transfer, etc.)

2) Assurez-vous que le test dure longtemps APRÈS un long échauffement. 30s est le strict minimum pour la période de mesure réelle, après un réchauffement également long, si possible. Par exemple, SPECjbb, etc. s'exécute pendant plusieurs minutes par itération, pour plusieurs itérations.