Ответ 1
Я бы использовал
newTime= (Calendar) originalDate.clone();
Мне нужно сделать копию заданной даты 100 секунд (я не могу передать по ссылке). Мне интересно, какие из двух ниже вариантов лучше.
newTime=Calendar.getInstance().setTime(originalDate);
ИЛИ
newTime=originalDate.clone();
Здесь главное преимущество.
ТНХ.
Я бы использовал
newTime= (Calendar) originalDate.clone();
date.getTime()
, если вам не нужно выполнять вычисления календаря.[*]
private static final int N = 100000;
public static void main(final String[] args) throws Exception {
final Date date = new Date();
{
final long start = System.currentTimeMillis();
for (int i = 0; i < N; i ++) {
final Date date2 = (Date) date.clone();
}
final long end = System.currentTimeMillis();
System.out.println("Clone: " + (end - start) + " ms");
}
{
final long start = System.currentTimeMillis();
for (int i = 0; i < N; i ++) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final Date date2 = cal.getTime();
}
final long end = System.currentTimeMillis();
System.out.println("Caldendar.setTime: " + (end - start) + " ms");
}
}
Результаты:
Clone: 13 ms
Caldendar.setTime: 317 ms
PS Я не уверен, если вам действительно нужен Calendar
или Date
, поэтому не стесняйтесь модифицировать тест...
(В ответ на комментарий: Чтобы повысить точность теста, вы также можете запускать тесты индивидуально, увеличивать значение N,...)
Моим подходом было бы перейти на вариант 1), а затем убедитесь, что приложение тщательно профилировано, чтобы проверить узкие места. Возможно, приведенный выше код не является проблемой вообще в общей производительности приложения в конце дня.
Я не могу передавать по ссылке
Вы уверены, что не можете. На Java нет такой вещи. Но я бы пересмотрел это требование. Каков реальный риск того, что кто-то изменит дату, если вы все время проходите вокруг одного и того же? и можете ли вы это контролировать? например проверяя getTime() до и после каждого вызова и бросая RTE, если он изменяется?
В Scala я сделал бы clone() и прилив в Календаре с .asInstanceOf [Calendar], например:
val now = Calendar.getInstance()
val newDate = now.clone().asInstanceOf[Calendar]