2016-08-18 1 views
1

J'essaie de comparer la puissance de calcul du CPU avec une fonction simple, sans ajouter d'énormes frameworks avec des milliers de lignes et quelques MB à mon projet.Analyse comparative de la puissance de calcul du processeur

J'ai développé cet exemple de code. C'est un qui fait 100 fois une énorme tâche. Cette énorme tâche (fonction benchmark()) consiste en un temps qui fera un calcul mathématique et augmentera un compteur sur une période de 100ms. Chaque 100ms il est imprimé dans le journal le nombre de fois que la fonction benchmark() a terminé le calcul mathématique complexe. OK, donc, j'ai imprimé 100 fois sur l'écran ce calcul.

Les premières fois que j'exécutent la référence que j'obtenir des résultats corrects, plus ou moins les mêmes résultats du journal pour chacune des 100 itérations de l'indice de référence:

08-18 13:09:52.806 26543-27748/com.mytestapp D/XXXX: Iteration: 0 Result: 118200 
08-18 13:09:52.906 26543-27748/com.mytestapp D/XXXX: Iteration: 1 Result: 171580 
08-18 13:09:53.006 26543-27748/com.mytestapp D/XXXX: Iteration: 2 Result: 170654 
08-18 13:09:53.106 26543-27748/com.mytestapp D/XXXX: Iteration: 3 Result: 168676 
08-18 13:09:53.206 26543-27748/com.mytestapp D/XXXX: Iteration: 4 Result: 168372 
08-18 13:09:53.306 26543-27748/com.mytestapp D/XXXX: Iteration: 5 Result: 165558 
08-18 13:09:53.406 26543-27748/com.mytestapp D/XXXX: Iteration: 6 Result: 171368 
08-18 13:09:53.506 26543-27748/com.mytestapp D/XXXX: Iteration: 7 Result: 171680 
08-18 13:09:53.606 26543-27748/com.mytestapp D/XXXX: Iteration: 8 Result: 171516 
08-18 13:09:53.706 26543-27748/com.mytestapp D/XXXX: Iteration: 9 Result: 171598 

Mais après quelques exécutions le nombre commence à diminuer, et je ne comprends pas pourquoi:

08-18 13:10:20.850 26543-28161/com.mytestapp D/XXXX: Iteration: 1 Result: 94320 
08-18 13:10:20.951 26543-28161/com.mytestapp D/XXXX: Iteration: 2 Result: 90364 
08-18 13:10:21.051 26543-28161/com.mytestapp D/XXXX: Iteration: 3 Result: 94240 
08-18 13:10:21.152 26543-28161/com.mytestapp D/XXXX: Iteration: 4 Result: 93676 
08-18 13:10:21.252 26543-28161/com.mytestapp D/XXXX: Iteration: 5 Result: 91554 
08-18 13:10:21.352 26543-28161/com.mytestapp D/XXXX: Iteration: 6 Result: 94358 
08-18 13:10:21.452 26543-28161/com.mytestapp D/XXXX: Iteration: 7 Result: 90954 
08-18 13:10:21.552 26543-28161/com.mytestapp D/XXXX: Iteration: 8 Result: 94874 
08-18 13:10:21.652 26543-28161/com.mytestapp D/XXXX: Iteration: 9 Result: 94464 

Si j'attends quelques minutes et réessaye, les résultats augmentent à nouveau à ses valeurs normales.

Pourquoi ce comportement? Comment l'éviter et obtenir des résultats de benchmark toujours corrects?

Ceci est mon exemple de code:

public void benchmarkIterator(){ 
    int result = 0; 
    int iterations = 100; 
    for (int i=0; i<iterations; i++){ 
     result = benchmark(); 
     Log.d("XXXX", "Iteration: "+i+" Result: "+result); 
    } 
} 

....

 public int benchmark(){ 
     long startTime = System.currentTimeMillis(); 
     int count=0; 
     double aux=0; 
     while((System.currentTimeMillis()-startTime)<100){ 
      count++; 
      double d = 7777777777d; 
      aux = 0; 
      aux=aux+(int)(aux+Math.sin(d)*Math.cos(d)); 
     } 
     return count; 
    } 
+0

Juste pour confirmer ma conclusion, un résultat plus grand signifie un processeur plus rapide à droite? Je veux dire plus d'opérations mathématiques ont été faites dans ce 100 MS? pourrait-il être une optimisation ou des trucs JIT? – Yazan

+0

le résultat le plus élevé, le calcul mathématique le plus rapide a ce cpu – NullPointerException

+0

Coult il surchauffe et une sorte de throtling thermique? – X3Btel

Répondre

1

Surchauffe? Non, je doute que ce calcul puisse faire craquer votre CPU.

Je pense que le changement au fil du temps a à voir avec la JVM et les statistiques. Le compilateur HotSpot les utilise pour optimiser le branchement de code en fonction de ce que fait votre code.

http://blog.takipi.com/jvm-performance-magic-tricks/

https://wiki.openjdk.java.net/display/HotSpot/PerformanceTechniques

La seule façon de savoir ce qui se passe est d'utiliser un profileur. Vous devez regarder la collecte des ordures, la mémoire, et où le temps est passé. Votre référence simple ne vous donnera pas ce genre de perspicacité.

+0

duffymo s'il vous plaît, pouvez-vous me donner un peu d'aide avec la façon de résoudre ce problème? ne peut pas trouver le moyen de le résoudre avec vos liens. Merci beaucoup – NullPointerException

+1

Je ne pense pas que vous ayez un problème à résoudre. Je signale que c'est ainsi que fonctionne la JVM. Le temps va s'améliorer à mesure que vous exécutez plus de cas à une valeur asymptotique. Si vous redémarrez l'application, elle devra se «réchauffer» et accumuler un nouveau modèle de branchement statistique. C'est une des raisons pour lesquelles les micro-benchmarks peuvent être trompeurs. – duffymo

+0

donc duffymo, la solution serait d'exécuter 1000 itérations et écouter seulement le résultat des 500 dernières? – NullPointerException

0

Si je comprends bien, les deux extraits de journal sont pour une exécution différente faite avec différents lancements JVM?

Dans ce cas, la différence entre les deux ne peut pas être provoquée par la JVM (car elle a été redémarrée). Donc, la différence peut être causée par beaucoup de choses: le cache de fichiers de l'OS (il y a déjà des fichiers en cours), la gestion de l'alimentation du CPU (la fréquence du CPU diminue) à sa fréquence max), quelque chose d'autre fonctionnant sur l'hôte (si c'est une VM ... beaucoup de choses peuvent se passer), l'optimisation du CPU (comme la prédiction de branchement), ...

Je n'ai pas de problème, c'est juste la façon dont fonctionne l'ordinateur/jvm/cpu ces jours-ci ...

+0

wtf, alors comment faire une référence pour android/java ?? aussi c'est dans la même exécution de l'aplication, j'appuie sur le bouton du banc quelques fois pour faire ces tests – NullPointerException

+0

si c'est sur le même lancement de la JVM, ça peut être l'optimisation interne de la JVM qui entre et sort. C'est complexe mais une certaine optimisation est faite par la JVM (le Hotspot/JIT) et si vous n'utilisez pas une partie du code, il peut aussi y avoir une certaine désoptimisation. Le benchmarking est vraiment difficile et ce type de micro-benchmarking doit être fait avec un harnais de benchamrking pour éviter l'optimisation JVM/OS et pas dans votre application. Vérifiez JMH: http://openjdk.java.net/projects/code-tools/jmh/ – loicmathieu

+0

merci beaucoup – NullPointerException