Calendar.getInstance() или calendar.clone()

Мне нужно сделать копию заданной даты 100 секунд (я не могу передать по ссылке). Мне интересно, какие из двух ниже вариантов лучше.

newTime=Calendar.getInstance().setTime(originalDate);

ИЛИ

newTime=originalDate.clone();

Здесь главное преимущество.

ТНХ.

Ответ 1

Я бы использовал

newTime= (Calendar) originalDate.clone();

Ответ 2

  • Моя кишка говорит мне, что 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,...)

Ответ 3

Моим подходом было бы перейти на вариант 1), а затем убедитесь, что приложение тщательно профилировано, чтобы проверить узкие места. Возможно, приведенный выше код не является проблемой вообще в общей производительности приложения в конце дня.

Ответ 4

Я не могу передавать по ссылке

Вы уверены, что не можете. На Java нет такой вещи. Но я бы пересмотрел это требование. Каков реальный риск того, что кто-то изменит дату, если вы все время проходите вокруг одного и того же? и можете ли вы это контролировать? например проверяя getTime() до и после каждого вызова и бросая RTE, если он изменяется?

Ответ 5

В Scala я сделал бы clone() и прилив в Календаре с .asInstanceOf [Calendar], например:

val now = Calendar.getInstance()
val newDate = now.clone().asInstanceOf[Calendar]