Comment convertir des nanosecondes en secondes en utilisant l’énumération TimeUnit?

Comment convertir une valeur de nanosecondes en secondes?

Voici le segment de code:

import java.io.*; import java.util.concurrent.*; .. class Stamper { public static void main (Ssortingng[] args) { long start = System.nanoTime(); //some try with nested loops long end = System.nanoTime(); long elapsedTime = end - start; System.out.println("elapsed: " + elapsedTime + "nano seconds\n"); //convert to seconds TimeUnit seconds = new TimeUnit(); System.out.println("which is " + seconds.toSeconds(elapsedTime) + " seconds"); }} 

L’erreur est

 Stamper.java:16: enum types may not be instantiated. 

Qu’est-ce que ça veut dire?

Eh bien, vous pourriez simplement diviser par 1 000 000 000:

 long elapsedTime = end - start; double seconds = (double)elapsedTime / 1000000000.0; 

Si vous utilisez TimeUnit pour convertir, vous obtiendrez un résultat long, vous perdrez donc la précision décimale, mais vous conserverez la précision du nombre entier.

TimeUnit Enum

L’expression suivante utilise l’énumération TimeUnit (Java 5 et TimeUnit ultérieures) pour convertir des nanosecondes en secondes:

 TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) 

TimeUnit est une énumération, vous ne pouvez donc pas en créer une nouvelle.

Ce qui suit va convertir 1000000000000ns en secondes.

 TimeUnit.NANOSECONDS.toSeconds(1000000000000L); 

Pour réduire la verbosité, vous pouvez utiliser une importation statique:

 import static java.util.concurrent.TimeUnit.NANOSECONDS; 

-et désormais juste taper

 NANOSECONDS.toSeconds(elapsedTime); 

Vous devriez écrire:

  long startTime = System.nanoTime(); long estimatedTime = System.nanoTime() - startTime; 

L’affectation de endTime dans une variable peut provoquer quelques nanosecondes. Dans cette approche, vous obtiendrez le temps écoulé exact.

Et alors:

 TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS) 

Cela convertira un temps en secondes dans un format double, ce qui est plus précis qu’une valeur entière:

 double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;