我试图获取月份价值。但我想检查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
答案 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库的Calendar
,Time4J,Joda-Time或某些C代码可以解决该问题,这是完全有效的理由。我很难想象会是这种情况,但是话又说回来,我不知道世界上所有的计算机系统。