2015-02-24 1 views
1

Je cours some benchmarks avec JMH et je reçois des valeurs de débit trépidant pour chaque itération, parfois différence de +/- 50%. (i7 4770K, Windows 7 x64, Java 1.8u31, JMH 0.9 - ne peut pas mettre à niveau). Les benchmarks créent beaucoup d'ordures à cause des entiers boxing et unboxing et utilisent fortement les blocs synchronisés. Augmenter le temps d'exécution de l'itération de 1s à 5s produit moins de variance.JMH donne des valeurs de débit trépidant

Mes questions sont les suivantes:

  • Comment puis-je découvrir la source de cet écart?
  • Pourquoi puis-je obtenir des valeurs de débit significativement plus élevées pendant le réchauffement?

Répondre

0

Si vous pouvez utiliser une version 0.9.1+, vous devriez jeter un oeil au profileur perfasm qui a été ajouté à JMH. Il vous permet de mapper l'assemblage de votre code sur le temps passé à chaque instruction. Cela nécessitera toutefois que vous utilisiez une machine Linux car elle utilise la commande perf. En dehors de cela, votre benchmark permet une certaine optimisation mais je suppose que c'est prévu. Vous ne consommez pas un résultat final par un trou noir mais vous choisissez de consommer des bits de données entre certains traitements. Cette approche est assez sujette aux erreurs et je vous recommande donc de regarder vraiment le code d'assemblage que cela produit, peu importe quoi, de telle sorte que vous puissiez dire ce que c'est réellement que vous mesurez!

+0

Merci. Cela était dû à plusieurs facteurs agissant en même temps: de grandes quantités de core-hopping dans le benchmark, l'activité GC et OS. – akarnokd