java.time.ZonedDateTime与java.util.Calendar性能检查
我试图得到月值。但我想检查哪个更好,java.util还是java.time来检索月值。这是我用来检查日历和分区DateTime性能的代码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(
//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代码将解决该问题,这是这样做的充分理由。我很难想象会是这样,但话说回来,我不知道世界上所有的计算机系统
链接
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
来检索引用。我可能错了。