Они взяли навсегда, чтобы загрузиться и начаться в браузере, и затем для большого количества людей они не работали. Когда они наконец загружались, интерфейсы были ужасными и неуклюжими. Я думаю, что плохой пользовательский опыт был большим шагом к созданию устаревших апплетов.
Так для ответа на исходный вопрос у меня есть мой собственный вопрос - Вы спрашиваете, "Почему сайты больше не используют апплеты Java", и мой ответ, "почему кто-либо хотел бы?"
К сожалению, ни один из десяти опубликованных на данный момент ответов не является правильным.
Если вы измеряете прошедшее время и хотите, чтобы оно было правильным , вы должны используйте System.nanoTime ()
. Вы не можете использовать System.currentTimeMillis ()
, если не возражаете, что ваш результат неверен.
Цель nanoTime
- измерить истекшее время , а цель currentTimeMillis
- измерить время настенных часов . Вы не можете использовать одно для другой цели. Причина в том, что никакие компьютерные часы не идеальны; он всегда дрейфует и время от времени требует исправления. Это исправление может произойти либо вручную, либо, в случае большинства машин, там ' sa процесс, который работает и постоянно вносит небольшие поправки в системные часы («настенные часы»). Это часто случается. Другая такая коррекция происходит всякий раз, когда есть дополнительная секунда.
Поскольку цель nanoTime
- измерение прошедшего времени, на нее не влияют никакие из этих небольших поправок. Это то, что вы хотите использовать. Любые текущие тайминги с currentTimeMillis
будут отключены - возможно, даже отрицательные.
Вы можете сказать: «Это не похоже на то, что это когда-либо будет иметь такое большое значение», на что я говорю, может быть нет, но в целом, не лучше ли правильный код, чем неправильный код? Кроме того, nanoTime
в любом случае короче для ввода.
Ранее опубликованные оговорки о nanoTime
, обычно имеющие только микросекундную точность, являются действительными.
Если вы предпочитаете использовать Java Calendar API , вы можете попробовать это,
Date startingTime = Calendar.getInstance().getTime();
//later on
Date now = Calendar.getInstance().getTime();
long timeElapsed = now.getTime() - startingTime.getTime();
Какие типы использовать для этого в 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 , подходящий для ваших нужд.
Какие типы использовать для выполнения этого в Java?
Краткий ответ - длинный
. А теперь подробнее о том, как измерить ...
"Традиционным" способом сделать это действительно является использование System.currentTimeMillis ()
:
long startTime = System.currentTimeMillis();
// ... do something ...
long estimatedTime = System.currentTimeMillis() - startTime;
Обратите внимание, что Commons Lang имеет класс StopWatch , который можно использовать для измерения времени выполнения в миллисекундах. В нем есть такие методы, как split ()
, suspend ()
, resume ()
и т. Д., Которые позволяют измерять измерения в разных точках выполнения, и что вы может оказаться удобным. Взгляните на него.
Вы можете предпочесть System.nanoTime ()
, если вам нужны чрезвычайно точные измерения прошедшего времени. Из его javadoc:
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
Другой вариант - использовать JAMon , инструмент, который собирает статистику (время выполнения, количество попаданий, среднее время выполнения, мин., Макс. И т. Д.) для любого кода, который находится между методами start () и stop (). Ниже очень простой пример:
import com.jamonapi.*;
...
Monitor mon=MonitorFactory.start("myFirstMonitor");
...Code Being Timed...
mon.stop();
Прочтите эту статью на сайте www.javaperformancetunning.com, чтобы получить хорошее представление.
Наконец, если вы не хотите загромождать код с этими измерениями (или если вы не можете изменить существующий код), то АОП будет идеальным оружием. Я не собираюсь обсуждать это очень глубоко, но я хотел хотя бы упомянуть об этом.
Ниже очень простой аспект с использованием 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 может быть легко адаптировано для мониторинга любого метода на основе имени класса, имени пакета, имени метода или любой их комбинации. Измерение - действительно идеальный вариант использования АОП.
Java предоставляет статический метод System.currentTimeMillis ()
. И это возвращает длинное значение, так что это хорошая ссылка. Многие другие классы принимают параметр timeInMillis, который также является длинным.
И многим людям проще использовать библиотеку Joda Time для вычисления даты и времени.
] Если вы пишете приложение, которое должно иметь дело с периодами времени, обратите внимание на 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);
}
Если вы получаете свои временные метки из System.currentTimeMillis ()
, тогда ваши временные переменные должны быть длинными.
Ваш новый класс:
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
Стоит отметить, что
Если цель состоит в том, чтобы просто напечатать приблизительную информацию о времени в журналах вашей программы, то простое решение для проектов 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);