Подтвердить что ты не робот

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

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

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

ИЛИ

newTime=originalDate.clone();

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

ТНХ.

4b9b3361

Ответ 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]