Comment convertir nanosecondes à quelques secondes en utilisant le enum TimeUnit?
Question
Comment convertir une valeur de nanosecondes à quelques secondes?
Voici le segment de code:
import java.io.*;
import java.util.concurrent.*;
..
class Stamper {
public static void main (String[] 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 cela signifie?
La solution
Eh bien, vous pouvez simplement diviser par 1000000000:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
Si vous utilisez TimeUnit
pour convertir, vous obtiendrez votre résultat comme une longue, de sorte que vous perdrez la précision décimale, mais maintenir la précision de nombre entier.
Autres conseils
TimeUnit
Enum
L'expression suivante utilise le TimeUnit
ENUM (Java 5 et versions ultérieures) pour convertir nanosecondes à quelques secondes:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
TimeUnit est un ENUM, de sorte que vous ne pouvez pas créer un nouveau.
Les éléments suivants convertira 1000000000000ns en secondes.
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Pour réduire verbosité, vous pouvez utiliser une importation statique:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-et désormais il suffit de taper
NANOSECONDS.toSeconds(elapsedTime);
Vous devriez écrire:
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
Affectation du endTime dans une variable peut causer quelques nanosecondes. Dans cette approche, vous obtiendrez exactement le temps écoulé.
Et puis:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Cela va convertir un temps en secondes dans un format double, ce qui est plus précise qu'une valeur entière:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;