Как преобразовать наносекунды в секунды, используя перечисление TimeUnit?
Вопрос
Как преобразовать значение из наносекунд в секунды?
Вот фрагмент кода:
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");
}}
Ошибка заключается в
Stamper.java:16: enum types may not be instantiated.
Что это значит?
Решение
Ну, вы могли бы просто разделить на 1 000 000 000:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
Если вы используете TimeUnit
при преобразовании вы получите результат в виде long, поэтому потеряете десятичную точность, но сохраните точность целых чисел.
Другие советы
TimeUnit
Перечисление
В следующем выражении используется TimeUnit
enum (Java 5 и более поздние версии) для преобразования из наносекунд в секунды:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
TimeUnit - это перечисление, поэтому вы не можете создать новое.
Следующее действие преобразует 1000000000000нс в секунды.
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Чтобы уменьшить детализацию, вы можете использовать статический импорт:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-и впредь просто печатайте
NANOSECONDS.toSeconds(elapsedTime);
Вы должны написать :
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
Назначение времени окончания в переменной может занять несколько наносекунд.При таком подходе вы получите точное затраченное время.
А потом:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Это преобразует время в секунды в двойном формате, который является более точным, чем целочисленное значение:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;