2016-03-18 6 views
0

Depuis que je voulais vérifier plusieurs méthodes (foo(int)) pour l'efficacité et de les comparer à l'exécution dans l'ensemble je fini par écrire quelque chose de similaire à:System.nanoTime() semble cassé. Alternative pour vérifier l'efficacité du code voulait

void testNanoTime(){ 
    long methodDuration = 0; 
    long testStart = System.nanoTime(); 
    for(int i= 0; i< 300; i++){ 

     long startJob = System.nanoTime(); 
     foo(i); //checking how foo does with certain data. 
     methodDuration+= System.nanoTime()-startJob; 

     bar(); 
    } 
    System.out.println("MethodDuration: "+methodDuration); 
    System.out.println("TestDuration: "+(System.nanoTime()-testStart)); 
} 

foo(int) a besoin parfois plusieurs minutes jusqu'à une demi-heure (mais pas en somme 293 ans!) par appel. Le problème est maintenant, que parfois le TestDuration (tout le temps que prend la méthode) est plus petit que la méthodeDuration, ce qui me semble impossible. D'où deux questions:

  • À quel montant mes anciens tests comparant methodDurations sont-ils toujours valides?
  • Que dois-je utiliser pour tester davantage les performances sans risque d'avoir des horodatages non valides? Serait System.currentTimeMillis() sûr d'aller ou a-t-il les mêmes problèmes?

Actuellement, le test a lieu sur un système Linux. J'ai déjà trouvé quelques questions et réponses plus anciennes concernant ce problème ici (par exemple Is System.nanoTime() completely useless?), mais certains indiquent qu'il s'agit d'un problème Windows et d'autres réponses restent floues car elles le mentionnent, elles peuvent être obsolètes (et elles ont même plusieurs années). Même la plupart des réponses se contredisent!

+1

Je ne parviens pas à reproduire ce problème en utilisant [Ideone] (http://ideone.com/5NnTxw). – bcsb1001

+0

@RC @Ideone Le problème est survenu avec des calculs plus importants dans les méthodes 'foo' et' bar' externalisées dans d'autres classes. Certaines des anciennes questions/réponses indiquent qu'il s'agit d'un problème avec les multicœurs, alors que d'autres indiquent que le problème a été résolu, d'autres affirment qu'il persiste (voir le lien de RC). Ce n'est pas un doublon dans un tel sens, puisque la réponse la plus mise à jour et la plus acceptée indique même qu'elle est très certainement périmée! – ctst

Répondre

1

Le profilage Java est plutôt complexe en fonction du fonctionnement de la JVM.

Voici quelques ressources pour vous aider à démarrer

pour plus de détails sur le temps de nano et comment il fonctionne, lisez Nano Time Completely Useless

Modifier: OP a édité le post pour mentionner, "Nano Time complètement inutile" mais le gardant dans la réponse depuis IMHO c'est toujours pertinent.

+0

Le problème dans mon cas est, les méthodes considérées utilisent des requêtes en dehors de Java (sinon vos solutions semblent bien). Aussi le goulot d'étranglement est connu, en ce moment je ne fais que comparer des solutions possibles, quand tombé sur cette question. – ctst