System.currentTimeMillis() против новой даты () против Calendar.getInstance(). GetTime()
В Java, каковы последствия использования производительности и ресурсов
System.currentTimeMillis()
против
new Date()
против
Calendar.getInstance().getTime()
Насколько я понимаю, System.currentTimeMillis() является наиболее эффективным. Однако в большинстве приложений это длинное значение необходимо преобразовать в Date или какой-либо подобный объект, чтобы сделать что-то значимое для человека.
8 ответов
System.currentTimeMillis()
очевидно, является наиболее эффективным, так как он даже не создает объект, но new Date()
на самом деле это просто тонкая обертка с длинной, поэтому она не сильно отстает. Calendar
с другой стороны, он относительно медленный и очень сложный, поскольку имеет дело со значительной сложностью и всеми странностями, присущими датам и временам (високосные годы, летнее время, часовые пояса и т. д.).
Как правило, это хорошая идея иметь дело только с длинными метками времени или Date
объекты в вашем приложении, и использовать только Calendar
когда вам действительно нужно выполнить вычисления даты / времени или отформатировать даты для их отображения пользователю. Если вам приходится много заниматься этим, возможно, стоит использовать Joda Time для более чистого интерфейса и лучшей производительности.
Глядя на JDK, самый внутренний конструктор для Calendar.getInstance()
имеет это:
public GregorianCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
setTimeInMillis(System.currentTimeMillis());
}
так что он автоматически делает то, что вы предлагаете. Конструктор даты по умолчанию содержит это:
public Date() {
this(System.currentTimeMillis());
}
Таким образом, действительно нет необходимости получать системное время специально, если только вы не захотите поработать с ним перед созданием объекта Calendar/Date. Также я рекомендую использовать joda-time вместо собственных классов календаря / даты в Java, если ваша цель - много работать с вычислениями даты.
Если вы ИСПОЛЬЗУЕТЕ свидание, тогда я настоятельно рекомендую вам использовать jodatime, http://joda-time.sourceforge.net/. С помощью System.currentTimeMillis()
для полей, которые являются датами, звучит как очень плохая идея, потому что в итоге вы получите много бесполезного кода.
И дата, и календарь серьезно сорваны, и Календарь, безусловно, худший из всех.
Я бы посоветовал вам использовать System.currentTimeMillis()
когда вы на самом деле работаете с миллисекундами, например, как это
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
На моей машине я попытался проверить это. Мой результат:
Calendar.getInstance (). GetTime() (*1000000 раз) = 402 мс new Date().getTime(); (*1000000 раз) = 18 мс System.currentTimeMillis() (*1000000 раз) = 16 мс
Не забывайте о GC (если вы используете Calendar.getInstance()
или же new Date()
)
Я предпочитаю использовать значение, возвращаемое System.currentTimeMillis()
для всех видов расчетов и только для использования Calendar
или же Date
если мне нужно действительно отображать значение, которое читают люди. Это также предотвратит 99% ваших ошибок при переходе на летнее время.:)
В зависимости от вашего приложения, вы можете рассмотреть возможность использования System.nanoTime()
вместо.
Я попробовал это:
long now = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
new Date().getTime();
}
long result = System.currentTimeMillis() - now;
System.out.println("Date(): " + result);
now = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
System.currentTimeMillis();
}
result = System.currentTimeMillis() - now;
System.out.println("currentTimeMillis(): " + result);
И результат был:
Дата (): 199
currentTimeMillis (): 3
System.currentTimeMillis()
очевидно, самый быстрый, потому что это только один вызов метода и сборщик мусора не требуется.