web-dev-qa-db-fra.com

Comment trouver le temps nécessaire pour exécuter un programme Java?

J'ai une Java application sur laquelle je travaille et je viens de réaliser que le programme doit retourner une valeur en moins d'une minute, mais je ne sais pas comment trouver ou afficher le temps nécessaire pour exécuter le programme Comment trouver le temps nécessaire pour exécuter un programme?

30
MK1

Vous pouvez comparer les temps en utilisant System.nanoTime(). Il retournera l'heure en nanosecondes.

Renvoie la valeur actuelle du minuteur système le plus précis disponible, en nanosecondes.

Vous pouvez l'utiliser comme ceci:

long startTime = System.nanoTime();

// code

long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns"); 

Liens utiles:

74
Jigar Joshi

Il n'y a aucun moyen intégré de voir depuis combien de temps votre programme fonctionne. Cependant, au début du programme, vous pouvez simplement enregistrer l'heure actuelle, afin que vous puissiez voir un peu plus tard combien de temps s'est écoulé.

public class MyProgram {
    private static long startTime = System.currentTimeMillis();

    public static void main(String[] args) {
        // Do stuff...

        // At the end
        long endTime = System.currentTimeMillis();
        System.out.println("It took " + (endTime - startTime) + " milliseconds");
    }
}
13
Jesper

Si vous avez Spring comme dépendance de votre projet (ou si cela ne vous dérange pas de l'ajouter), vous pouvez utiliser StopWatch. Comme son nom l'indique, une fois initialisé, il comptera le temps jusqu'à ce que vous l'arrêtiez. Vous pouvez ensuite vérifier le temps pris pour une tâche. Plusieurs StopWatches peuvent être utilisés simultanément pour plusieurs tâches en gardant le code propre.

En plus de garder votre code propre, StopWatches aide à formater l'heure et d'autres méthodes utilitaires.

public void myMethod(){
    StopWatch stopWatch = new StopWatch();

    stopWatch.start("Task1");
    // ...
    // Do my thing
    // ...
    stopWatch.stop();
    System.out.println("Task executed in " + stopWatch.getTotalTimeSeconds() + "s");
}
2
Felipe Leão

Si vous voulez simplement savoir combien de temps votre programme s'exécute, utilisez System.currentTimeMillis () au début et à la fin de votre programme.

1
AlexR

Vous pouvez utiliser 2 API fournies par la classe System

  1. System.currentTimeMillis () Si le code prend du temps dans la plage des millisecondes
  2. System.nanoTime () Si le code prend du temps dans la plage de nanosecondes

Exemple de code

public class TestTimeTaken {
    public static void main(String args[]) throws InterruptedException{
        long startTimeNanoSecond = System.nanoTime();
        long startTimeMilliSecond = System.currentTimeMillis();

        //code
        Thread.sleep(1000);
        //code

        long endTimeNanoSecond = System.nanoTime();
        long endTimeMilliSecond = System.currentTimeMillis();

        System.out.println("Time Taken in "+(endTimeNanoSecond - startTimeNanoSecond) + " ns");
        System.out.println("Time Taken in "+(endTimeMilliSecond - startTimeMilliSecond) + " ms");


    }
}
1
Om Prakash Sao

J'aime utiliser la classe Apache Commons StopWatch lorsque j'ai la bibliothèque disponible.

import org.Apache.commons.lang3.time.StopWatch;

// ...

StopWatch stopWatch = new StopWatch();
String message = "Task : %s (%s) seconds";

// ...

stopWatch.split();
System.out.println(String.format(message, "10", stopWatch.toSplitString()));

// ...

stopWatch.split();
System.out.println(String.format(message, "20", stopWatch.toSplitString()));

stopWatch.stop();

0
Gabriel Gates

Il s'agit d'un cas d'utilisation typique pour les aspects, par exemple en utilisant Spring AOP :

@Aspect
public class TimerAspect {

    private static final Logger LOG = Logger.getLogger(TimerAspect.class);

    @Around("com.xyz.myapp.MyClass.myMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.nanoTime();
        Object retVal = pjp.proceed();
        long endTime = System.nanoTime();
        LOG.info(String.format("Call to %s.%s with args %s took %s ns", pjp.getTarget(), pjp.getSignature(), Arrays.toString(pjp.getArgs()), endTime - startTime));
        return retVal;
    }
}

Et dans votre contexte d'application:

<aop:aspectj-autoproxy/>
<bean id="myAspect" class="org.xyz.TimerAspect"/>   
0
Adriaan Koster