首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.time.ZonedDateTime与java.util.Calendar的性能检查

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

Stack Overflow用户
提问于 2019-06-30 11:20:48
回答 1查看 635关注 0票数 0

我在试着得到月价值。但是我想检查哪个更好,java.util还是java.time来检索月份值。这是我的代码来检查日历和ZonedDateTime的性能。

代码语言:javascript
复制
    //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表现得更好。但我在这里找到了相反的答案。我的结果是:

代码语言:javascript
复制
month value 6at: 0  //Calendar
month value 6at: 9000000 //ZonedDateTime

知道为什么会发生这种事吗。以及任何关于为什么我应该使用java.util.Calender而不是java.timeZonedDateTime的建议。

P.S.我甚至在month2之后将month1检索为:

代码语言:javascript
复制
    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);

仍未改变:

代码语言:javascript
复制
month value 6at: 8000000   //ZonedDateTime
month value 6at: 0  //Calendar
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-30 12:57:26

java.time的设计目标包括明确和预期的行为、不变的对象、线程安全、利用标准以及其他一些要点。目标不包括比旧的日期时间类(包括Calendar )执行得更快。此外,虽然我听到很多关于旧班的抱怨,但我没有听到他们表现太差的抱怨。

如果现代API的高级设计在某些情况下会造成性能损失,我认为我们不应该感到惊讶或担心。

不过,你的测量是不可信的。做一个正确的基准比这要复杂得多。我也做了一些不可信的测量:在我的电脑上,CalendarZonedDateTime分别得到了12478930纳米和66794865,其中一半使用System.nanoTime()进行测量。YearMonth.now().getMonthValue() (也来自java.time)仅在8 339306,约一个日历的15 (1/15)。

事实上,对于Calendar来说,您必须向月份值添加1,而读者需要理解为什么添加1,对于99.5 %的情况来说,这比性能重要得多。

当然,如果在您的特定系统中,性能瓶颈和可靠的度量告诉您,将您的方法之一切换到使用CalendarTime4J尤达-时间、一些Apache库或一些C代码将解决这个问题,这是一个完全有效的理由。我很难想象会是这样,但话又说回来,我不知道世界上所有的计算机系统。

链接

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56824452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档