Come convertire nanosecondi per pochi secondi utilizzando l'enum TIMEUNIT?
Domanda
Come convertire un valore da nanosecondi a secondi?
Ecco il segmento di codice:
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'errore è
Stamper.java:16: enum types may not be instantiated.
Che cosa significa questo?
Soluzione
Bene, si può solo dividere per 1000 milioni:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
Se si utilizza TimeUnit
convertire, si otterrà il risultato di un lungo, quindi si perde precisione decimale, ma mantengono numero intero di precisione.
Altri suggerimenti
TimeUnit
Enum
La seguente espressione utilizza il TimeUnit
enum (Java 5 e versioni successive) convertire da nanosecondi a secondi:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
TIMEUNIT è un enum, quindi non è possibile crearne uno nuovo.
Di seguito convertirà 1000000000000ns di secondi.
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Per ridurre il livello di dettaglio, è possibile utilizzare una di importazione statica:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-e ora in poi basta digitare
NANOSECONDS.toSeconds(elapsedTime);
Si dovrebbe scrivere:
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
Assegnazione del endTime in una variabile potrebbe causare pochi nanosecondi. In questo approccio si otterrà l'esatto tempo trascorso.
E poi:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Questo convertire un tempo di secondi in un doppio formato, che è più preciso di un valore intero:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;