Как я имею размеры, время протекло в Java? [дубликат]

Они взяли навсегда, чтобы загрузиться и начаться в браузере, и затем для большого количества людей они не работали. Когда они наконец загружались, интерфейсы были ужасными и неуклюжими. Я думаю, что плохой пользовательский опыт был большим шагом к созданию устаревших апплетов.

Так для ответа на исходный вопрос у меня есть мой собственный вопрос - Вы спрашиваете, "Почему сайты больше не используют апплеты Java", и мой ответ, "почему кто-либо хотел бы?"

319
задан Mark Rotteveel 10 July 2018 в 04:33
поделиться

10 ответов

К сожалению, ни один из десяти опубликованных на данный момент ответов не является правильным.

Если вы измеряете прошедшее время и хотите, чтобы оно было правильным , вы должны используйте System.nanoTime () . Вы не можете использовать System.currentTimeMillis () , если не возражаете, что ваш результат неверен.

Цель nanoTime - измерить истекшее время , а цель currentTimeMillis - измерить время настенных часов . Вы не можете использовать одно для другой цели. Причина в том, что никакие компьютерные часы не идеальны; он всегда дрейфует и время от времени требует исправления. Это исправление может произойти либо вручную, либо, в случае большинства машин, там ' sa процесс, который работает и постоянно вносит небольшие поправки в системные часы («настенные часы»). Это часто случается. Другая такая коррекция происходит всякий раз, когда есть дополнительная секунда.

Поскольку цель nanoTime - измерение прошедшего времени, на нее не влияют никакие из этих небольших поправок. Это то, что вы хотите использовать. Любые текущие тайминги с currentTimeMillis будут отключены - возможно, даже отрицательные.

Вы можете сказать: «Это не похоже на то, что это когда-либо будет иметь такое большое значение», на что я говорю, может быть нет, но в целом, не лучше ли правильный код, чем неправильный код? Кроме того, nanoTime в любом случае короче для ввода.

Ранее опубликованные оговорки о nanoTime , обычно имеющие только микросекундную точность, являются действительными.

629
ответ дан 23 November 2019 в 00:59
поделиться

Если вы предпочитаете использовать Java Calendar API , вы можете попробовать это,

Date startingTime = Calendar.getInstance().getTime();
//later on
Date now = Calendar.getInstance().getTime();
long timeElapsed = now.getTime() - startingTime.getTime();
3
ответ дан 23 November 2019 в 00:59
поделиться

Какие типы использовать для этого в Java?

Ответ : long

public class Stream {
    public long startTime;
    public long endTime;

    public long getDuration() {
        return endTime - startTime;
    }
    // I  would add
    public void start() {
        startTime = System.currentTimeMillis();
    }
    public void stop() {
         endTime = System.currentTimeMillis();
     }
}

Использование:

  Stream s = .... 

  s.start();

  // do something for a while 

  s.stop();

  s.getDuration(); // gives the elapsed time in milliseconds. 

Это мой прямой ответ на ваш первый вопрос.

Для последнего «примечания» я бы посоветовал вам использовать Joda Time. Он содержит класс interval , подходящий для ваших нужд.

6
ответ дан 23 November 2019 в 00:59
поделиться

Какие типы использовать для выполнения этого в Java?

Краткий ответ - длинный . А теперь подробнее о том, как измерить ...

System.currentTimeMillis ()

"Традиционным" способом сделать это действительно является использование System.currentTimeMillis () :

long startTime = System.currentTimeMillis();
// ... do something ...
long estimatedTime = System.currentTimeMillis() - startTime;

oacltStopWatch

Обратите внимание, что Commons Lang имеет класс StopWatch , который можно использовать для измерения времени выполнения в миллисекундах. В нем есть такие методы, как split () , suspend () , resume () и т. Д., Которые позволяют измерять измерения в разных точках выполнения, и что вы может оказаться удобным. Взгляните на него.

System.nanoTime ()

Вы можете предпочесть System.nanoTime () , если вам нужны чрезвычайно точные измерения прошедшего времени. Из его javadoc:

long startTime = System.nanoTime();    
// ... the code being measured ...    
long estimatedTime = System.nanoTime() - startTime;

Jamon

Другой вариант - использовать JAMon , инструмент, который собирает статистику (время выполнения, количество попаданий, среднее время выполнения, мин., Макс. И т. Д.) для любого кода, который находится между методами start () и stop (). Ниже очень простой пример:

import com.jamonapi.*;
...
Monitor mon=MonitorFactory.start("myFirstMonitor");
...Code Being Timed...
mon.stop();

Прочтите эту статью на сайте www.javaperformancetunning.com, чтобы получить хорошее представление.

Использование AOP

Наконец, если вы не хотите загромождать код с этими измерениями (или если вы не можете изменить существующий код), то АОП будет идеальным оружием. Я не собираюсь обсуждать это очень глубоко, но я хотел хотя бы упомянуть об этом.

Ниже очень простой аспект с использованием AspectJ и JAMon (здесь краткое имя pointcut будет использоваться для монитора JAMon, отсюда и вызов thisJoinPoint.toShortString () ):

public aspect MonitorAspect {
    pointcut monitor() : execution(* *.ClassToMonitor.methodToMonitor(..));

    Object arround() : monitor() {
        Monitor monitor = MonitorFactory.start(thisJoinPoint.toShortString());
        Object returnedObject = proceed();
        monitor.stop();
        return returnedObject;
    }
}

Определение pointcut может быть легко адаптировано для мониторинга любого метода на основе имени класса, имени пакета, имени метода или любой их комбинации. Измерение - действительно идеальный вариант использования АОП.

208
ответ дан 23 November 2019 в 00:59
поделиться

Java предоставляет статический метод System.currentTimeMillis () . И это возвращает длинное значение, так что это хорошая ссылка. Многие другие классы принимают параметр timeInMillis, который также является длинным.

И многим людям проще использовать библиотеку Joda Time для вычисления даты и времени.

]
7
ответ дан 23 November 2019 в 00:59
поделиться

Если вы пишете приложение, которое должно иметь дело с периодами времени, обратите внимание на Joda-Time, в котором есть класс, специально предназначенный для обработки длительностей, интервалов и Периоды. Ваш метод getDuration () выглядит так, как будто он может возвращать интервал времени Joda:

DateTime start = new DateTime(2004, 12, 25, 0, 0, 0, 0);
DateTime end = new DateTime(2005, 1, 1, 0, 0, 0, 0);

public Interval getInterval() {
    Interval interval = new Interval(start, end);
}
3
ответ дан 23 November 2019 в 00:59
поделиться

Если вы получаете свои временные метки из System.currentTimeMillis () , тогда ваши временные переменные должны быть длинными.

1
ответ дан 23 November 2019 в 00:59
поделиться

Ваш новый класс:

public class TimeWatch {    
    long starts;

    public static TimeWatch start() {
        return new TimeWatch();
    }

    private TimeWatch() {
        reset();
    }

    public TimeWatch reset() {
        starts = System.currentTimeMillis();
        return this;
    }

    public long time() {
        long ends = System.currentTimeMillis();
        return ends - starts;
    }

    public long time(TimeUnit unit) {
        return unit.convert(time(), TimeUnit.MILLISECONDS);
    }
}

Использование:

    TimeWatch watch = TimeWatch.start();
    // do something
    long passedTimeInMs = watch.time();
    long passedTimeInSeconds = watch.time(TimeUnit.SECONDS);

Затем прошедшее время можно преобразовать в любой формат, который вам нравится, с помощью календаря, например

Greetz, GHad

35
ответ дан 23 November 2019 в 00:59
поделиться

Стоит отметить, что

  • System.currentTimeMillis () в лучшем случае имеет точность только миллисекунды. В некоторых системах Windows оно может составлять 16 мс. Он имеет меньшую стоимость, чем альтернативы <200 нс.
  • System.nanoTime () имеет точность только в микросекундах на большинстве систем и может перескакивать на системы Windows на 100 микросекунд (т.е. иногда это не так точно, как кажется)
  • ] Календарь - очень дорогой способ расчета времени. (я могу думать об этом отдельно от XMLGregorianCalendar) Иногда это наиболее подходящее решение, но имейте в виду, что вы должны использовать только большие интервалы времени.
8
ответ дан 23 November 2019 в 00:59
поделиться

Если цель состоит в том, чтобы просто напечатать приблизительную информацию о времени в журналах вашей программы, то простое решение для проектов Java - не писать собственные секундомер или классы таймера, а просто использовать org.apache.commons.lang.time.StopWatch , который является частью Apache Commons Lang.

final StopWatch stopwatch = new StopWatch();
stopwatch.start();
LOGGER.debug("Starting long calculations: {}", stopwatch);
...
LOGGER.debug("Time after key part of calcuation: {}", stopwatch);
...
LOGGER.debug("Finished calculating {}", stopwatch);
20
ответ дан 23 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: