java.time.ZonedDateTime与java.util.Calendar性能检查

时间:2019-06-30 11:20:48

标签: java performance date zoneddatetime java.util.calendar

我试图获取月份价值。但我想检查java.util或java.time中哪个更好,以检索月份值。这是我的代码,用于检查Calender vs 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比日历更好。但是在这里我发现了相反的情况。我的结果是:

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

1 个答案:

答案 0 :(得分:5)

design goals of java.time包括明确和预期的行为,不可变的对象,线程安全性,利用标准以及许多其他要点。目标不是包括比包括Calendar在内的旧日期时间类的执行速度更快。另外,虽然我曾经听到过关于旧班级的很多抱怨,但我却听不到没有他们的表现太差的抱怨。

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

不过,您的测量结果不可信。进行正确的基准测试比这复杂得多。我也进行了一些不可信的测量:在我的计算机上,Calendar的测量结果为124 178 930纳米,ZonedDateTime的测量结果为66 794 865,大约一半是使用System.nanoTime()进行测量的。 YearMonth.now().getMonthValue()(同样来自java.time)仅在8 339 306(大约为日历的15分之一(1/15))中执行。

仅对于Calendar,您必须在月份值上加1,而读者需要了解为什么要加1,这一事实对于99.5%的情况而言,要比性能重要得多。

当然,如果在您的特定系统中存在性能瓶颈,并且值得信赖的度量标准告诉您,将您的方法之一切换为使用某些Apache库的CalendarTime4JJoda-Time或某些C代码可以解决该问题,这是完全有效的理由。我很难想象会是这种情况,但是话又说回来,我不知道世界上所有的计算机系统。

链接