Wie ns Sekunden mit der Timeunit Enumeration konvertieren?
Frage
Wie man einen Wert von Nanosekunden bis Sekunden konvertieren?
Hier ist das Code-Segment:
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");
}}
Der Fehler ist
Stamper.java:16: enum types may not be instantiated.
Was bedeutet das?
Lösung
Nun, Sie könnten nur teilen, indem er 1000000000:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
Wenn Sie TimeUnit
verwenden zu konvertieren, werden Sie Ihr Ergebnis als lange erhalten, so dass Sie Dezimalgenauigkeit verlieren, aber ganze Zahl Präzision beibehalten.
Andere Tipps
TimeUnit
Enum
Der folgende Ausdruck verwendet das TimeUnit
enum (Java 5 und höher) von Nanosekunden bis Sekunden zu konvertieren:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
Timeunit ist eine Enumeration, so dass Sie nicht einen neuen erstellen können.
Im Folgenden wird 1000000000000ns auf Sekunden konvertieren.
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Zur Reduzierung der Ausführlichkeit, können Sie einen statischen Import verwenden:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-und von nun an nur geben
NANOSECONDS.toSeconds(elapsedTime);
Sie sollten schreiben:
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
Zuweisen des endTime in einer Variablen kann ein paar Nanosekunden verursachen. Bei diesem Ansatz werden Sie die genaue verstrichene Zeit.
Und dann:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Dies wird eine Zeit bis Sekunden in einem Doppelformat konvertieren, das als ein ganzzahliger Wert präziser ist:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;