313 votes

Mesurer le temps d'exécution d'une méthode Java

Comment calculer le temps d'exécution d'une méthode en Java ?

1 votes

Lol, cela fait beaucoup de doublons :D dommage que lorsque vous fermez une question, vous ne pouvez en nommer qu'une seule :(

1 votes

Voici une classe de chronomètre pour java. Le format de sortie du temps est identique à celui de la classe Stopwatch de .NET. carlosqt.blogspot.com/2011/05/stopwatch-class-for-java.html

0 votes

Vous avez oublié de mentionner explicitement l'objectif de la mesure, qui pourrait avoir une influence sur la manière dont elle doit être effectuée. Quoi qu'il en soit, il semble que vous souhaitiez optimiser les performances. Dans ce cas, vous devriez absolument vous renseigner sur le "Micro Benchmarking". Bien que l'approche System.nanoTime() soit assez simple, il n'existe pas de moyen facile de mesurer exactement les performances d'un programme, car elles dépendent d'un grand nombre de facteurs différents (par exemple, le matériel, les autres logiciels fonctionnant sur le même système, la compilation juste-à-temps et à chaud, les données d'entrée, etc.)

11voto

kinshuk4 Points 586

Si vous êtes en train d'écrire l'application, alors la réponse est d'utiliser l'option System.currentTimeMillis ou System.nanoTime servent l'objectif indiqué par les personnes ci-dessus.

Mais si vous avez déjà écrit le code, et que vous ne voulez pas le modifier, il est préférable d'utiliser les intercepteurs de méthodes de Spring. Ainsi, par exemple, votre service est :

public class MyService { 
    public void doSomething() {
        for (int i = 1; i < 10000; i++) {
            System.out.println("i=" + i);
        }
    }
}

Pour éviter de modifier le service, vous pouvez écrire votre propre intercepteur de méthode :

public class ServiceMethodInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = methodInvocation.proceed();
        long duration = System.currentTimeMillis() - startTime;
        Method method = methodInvocation.getMethod();
        String methodName = method.getDeclaringClass().getName() + "." + method.getName();
        System.out.println("Method '" + methodName + "' took " + duration + " milliseconds to run");
        return null;
    }
}

Il existe également des API open source disponibles pour Java, par exemple BTrace . ou Netbeans profiler comme suggéré ci-dessus par @bakkal et @Saikikos. Merci.

5voto

stefan bachert Points 4698

Tel que proposé, nanoTime () est très précis sur des échelles de temps courtes. Lorsque cette précision est requise, il faut faire attention à ce que l'on mesure réellement. En particulier, il ne faut pas mesurer le nom du nano-temps lui-même.

long start1 = System.nanoTime();
// maybe add here a call to a return to remove call up time, too.
// Avoid optimization 
long start2 = System.nanoTime();
myCall(); 
long stop = System.nanoTime();
long diff = stop - 2*start2 + start1;

System.out.println(diff + " ns");

D'ailleurs, vous mesurerez différentes valeurs pour le même appel en raison des facteurs suivants

  • d'autres charges sur votre ordinateur (arrière-plan, réseau, mouvement de la souris, interruptions, commutation de tâches, threads)
  • garnitures de cachets (froids, chauds)
  • compilation de jit (pas d'optimisation, baisse de performance due à l'exécution du compilateur, augmentation de la performance due au compilateur (mais parfois le code avec jit est plus lent que sans !))

1voto

sarvesh Points 9

En fait, le nanotime n'est même pas bon pour le temps écoulé car il dérive beaucoup plus que currentTimeMillis. De plus, le nanotime a tendance à fournir une précision excessive au détriment de la précision. Il est donc très incohérent et doit être affiné.

Pour tout processus de mesure du temps, currentTimeMillis (bien que presque aussi mauvais), fait mieux en termes d'équilibre entre exactitude et précision.

2 votes

CurrentTimeMillis ne doit pas être utilisé pour le calcul du temps écoulé car il n'est pas monotone (vous pourriez vous retrouver avec un temps écoulé négatif !). Voir par exemple stackoverflow.com/questions/2978598/

0voto

Saikios Points 981

La meilleure solution pour vous n'est pas un code, c'est le profileur de netbeans ou un logiciel similaire. http://profiler.netbeans.org/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X