Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.time.ZonedDateTime与java.util.Calendar性能检查_Java_Performance_Date_Zoneddatetime_Java.util.calendar - Fatal编程技术网

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

java.time.ZonedDateTime与java.util.Calendar性能检查,java,performance,date,zoneddatetime,java.util.calendar,Java,Performance,Date,Zoneddatetime,Java.util.calendar,我试图得到月值。但我想检查哪个更好,java.util还是java.time来检索月值。这是我用来检查日历和分区DateTime性能的代码 //import java.time.Instant; //import java.time.ZonedDateTime; //import java.util.Calendar; Instant instant, instant2; String diff; instant = Instant.now(

我试图得到月值。但我想检查哪个更好,java.util还是java.time来检索月值。这是我用来检查日历和分区DateTime性能的代码

    //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好。因此,我期望ZoneDateTime的表现会比Calendar更好。但在这里我发现了相反的结果。我的结果是:

month value 6at: 0  //Calendar
month value 6at: 9000000 //ZonedDateTime
你知道为什么会这样吗。还有关于为什么我应该使用java.util.Calender而不是java.TimeZoneDateTime的任何建议

p.S.I甚至在第1个月之后将第2个月的检索颠倒为:

    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
其中包括清晰和预期的行为、不可变对象、线程安全、标准的利用以及其他一些要点。目标不包括比旧日期时间类(包括
Calendar
)更快的执行速度。此外,尽管我听到了许多关于旧课程的抱怨,但我没有听到任何关于他们表现太差的抱怨

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

不过,你的测量结果并不可靠。进行正确的基准测试要比这复杂得多。我也做了一些不可信的测量:在我的计算机上,我用
系统.nanoTime()
进行测量,得到了
日历的124 178 930纳秒,分区时间的66 794 865纳秒,大约一半<代码>YearMonth.now().getMonthValue()
(也来自java.time)仅在8339 306中执行,约为日历的15分之一(1/15)

事实上,对于
日历
而言,您必须在月值中添加1,并且读者需要理解为什么添加1,对于99.5%的情况来说,这比性能更重要

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

链接

您不应该使用obesolete
java.util
时间类,因为它们包含bug。来自
Java.time
的Java 8类应该优先。corectness>性能。毫无疑问,java.time会更好。事实上,对于
Calendar
,您必须添加1,读者需要理解您添加1的原因。可怕的。糟糕。对于99.5%的情况来说,这比性能更重要。我猜这会更快,因为简单地导入Calendar类会导致Calendar的静态实例在任何基准测试代码运行之前实例化,而使用ZonedDateTime.now()则会创建一个新实例。每毫秒有10^6毫微秒,所以你看到的大数字实际上只有8毫秒。@Blake公平地说
Calendar.getInstance()
也在创建一个新实例。@OleV.V。你确定吗?这是一个静态实例,因此我假设它是在调用
getInstance
之前实例化的。正如我所暗示的,只要导入
Calendar
就会创建该实例,而不管您是否调用
getInstance
来检索引用。我可能错了。