java.time.ZonedDateTime 对比 java.util.Calendar 性能检查

java.time.ZonedDateTime Vs java.util.Calendar performance check

我正在尝试获取月值。但我想检查哪个更好,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。我什至在 month1 之后反转检索 month2 为:

    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

design goals of java.time 包括明确和预期的行为、不可变对象、thread-safety、标准的利用以及许多其他要点。目标 包括比旧 date-time 类 包括 Calendar 更快的执行速度。此外,虽然我 听到 无数 对旧 类 的抱怨,但我 没有 ] 抱怨他们表现太差。

如果现代 API 的卓越设计在某些情况下会导致性能下降,我认为我们不应该感到惊讶或担心。

不过,您的测量值不可信。进行正确的基准测试比这更复杂。我也做了一些不可信的测量:在我的电脑上,我得到了 Calendar 的 124 178 930 纳米和 ZonedDateTime 的 66 794 865 纳米,大约一半,使用 System.nanoTime() 进行测量。 YearMonth.now().getMonthValue()(也来自 java.time)仅执行了 8 339 306,大约是日历的十五分之一 (1/15)。

对于 Calendar,您必须将月份值加 1 而 reader 需要理解为什么加 1,这一事实比性能重要得多,因为 99.5%案例数。

当然,如果在您的特定系统中存在性能瓶颈并且可靠的测量结果告诉您将其中一种方法切换为使用 CalendarTime4J, Joda-Time、某些 Apache 库或某些 C 代码将解决该问题,这是这样做的完全正当理由。我很难想象会是这样,但话又说回来,我不知道世界上所有的计算机系统。

链接