java.time.ZonedDateTime Vs java.util.Calendar проверка производительности - PullRequest
0 голосов
/ 30 июня 2019

Я пытался получить значение месяца. Но я хотел проверить, что лучше, java.util или java.time, чтобы получить значение месяца. Это мой код для проверки производительности Calender против ZonedDateTime.

    //import java.time.Instant;
    //import java.time.ZonedDateTime;
    //import java.util.Calendar;

    Instant instant, instant2; 
    String diff;

    instant = Instant.now();
    int month2 = Calendar.getInstance().get(Calendar.MONTH) + 1;
    instant2 = Instant.now();
    diff = String.valueOf(instant2.getNano() - instant.getNano());
    System.out.println("month value " + month2 + "at: " + diff);

    instant = Instant.now();
    int month1 = ZonedDateTime.now().getMonth().getValue();
    instant2 = Instant.now();
    diff = String.valueOf(instant2.getNano() - instant.getNano());
    System.out.println("month value " + month1 + "at: " + diff);

Я думал, что java.time лучше, чем java.util. Следовательно, я ожидал, что ZonedDateTime будет работать лучше, чем Calendar. Но здесь я нашел обратное. Мой результат был:

month value 6at: 0  //Calendar
month value 6at: 9000000 //ZonedDateTime

Любые идеи, почему это происходит. И любое предложение о том, почему я должен таким образом использовать java.util.Calender вместо java.timeZonedDateTime.

P.S. Я даже отменил получение month2 после month1 как:

    Instant instant, instant2; 
    String diff;

    instant = Instant.now();
    int month1 = ZonedDateTime.now().getMonth().getValue();
    instant2 = Instant.now();
    diff = String.valueOf(instant2.getNano() - instant.getNano());
    System.out.println("month value " + month1 + "at: " + diff);

    instant = Instant.now();
    int month2 = Calendar.getInstance().get(Calendar.MONTH) + 1;
    instant2 = Instant.now();
    diff = String.valueOf(instant2.getNano() - instant.getNano());
    System.out.println("month value " + month2 + "at: " + diff);

Все тот же:

month value 6at: 8000000   //ZonedDateTime
month value 6at: 0  //Calendar

1 Ответ

5 голосов
/ 30 июня 2019

Цели разработки java.time включали ясное и ожидаемое поведение, неизменные объекты, безопасность потоков, использование стандартов и ряд других моментов. Цели не включали в себя выполнение быстрее, чем старые классы даты и времени, включая Calendar. Кроме того, хотя я слышал слышал многочисленные жалобы на старые классы, я слышал нет жалоб на то, что они выполнялись слишком плохо.

Если намного превосходящий дизайн современного API в некоторых случаях стоит потери производительности, я не думаю, что мы должны удивляться или беспокоиться.

Ваши измерения не заслуживают доверия, хотя. Правильный бенчмаркинг сложнее, чем это. Я также провел несколько ненадежных измерений: на моем компьютере я только что получил 124 178 930 нанограмм для Calendar и 66 794 865 для ZonedDateTime, примерно половину, используя System.nanoTime() для измерений. YearMonth.now().getMonthValue() (также из java.time), выполненный всего за 8 339 306, около 15-го (1/15) Календаря.

Тот факт, что для Calendar нужно добавить 1 к значению месяца, а читателю необходимо понять, почему вы добавляете 1, гораздо важнее производительности, для 99,5% случаев.

Конечно, если в вашей конкретной системе у вас есть узкое место в производительности и надежные измерения говорят вам, что переключение одного из ваших методов на использование Calendar, Time4J , Joda-Time, некоторая библиотека Apache или некоторый C-код решит эту проблему, это вполне веская причина для этого. Мне трудно представить, что это будет так, но опять же, я не знаю всех компьютерных систем в мире.

Ссылки

...