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?
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:
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");
}
}
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");
}
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.
Vous pouvez utiliser 2 API fournies par la classe System
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");
}
}
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();
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"/>