【性能测试篇】你现在用的SIMPLEDATEFORMAT类性能最差!…
先来说说JAVA各种DATEFORMAT的使用
SIMPLEDATEFORMAT
new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date());
LOCALDATETIME(JDK8)
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"));
DATEFORMATUTILS(COMMONS.LANG3)
DateFormatUtils.format(new Date(), "yyyyMMdd HH:mm:ss");
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
ORG.JODA.TIME.DATETIME
DateTime.now().toString("yyyyMMdd HH:mm:ss");
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
JMH微机准测试
*JMH微机准测试框架不清楚的可以自行Google*此次测试环境:本机cpu i7 2.6GHz
方式 | 吞吐ops/s |
---|---|
SimpleDateFormat | 811176 |
DateTime(joda) | 3677864 |
DateFormatUtils(commons-lang3) | 2684990 |
LocalDateTime(jdk8) | 1366451 |
测试结论
SimpleDateFormat性能最差,但是,平常我们不注意,却用得最多!
Joda对于当前时间的字符格式化性能最好,
DateFormatUtils其次。
但是对于指定时间进行格式化,Joda并不支持,所以功能有其局限性。
相比而言,DateFormatUtils功能相对丰富,静态方法使用简单,也是线程安全,可以说是我们编码时的第一选择。
以后,格式时间的时候,
请多使用DateFormatUtils (commons.lang3)
【性能测试篇】你现在用的SIMPLEDATEFORMAT类性能最差!还不赶紧看看JAVA 各种DATEFORMAT工具性能比对…
先来说说JAVA各种DATEFORMAT的使用
SIMPLEDATEFORMAT
new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date());
LOCALDATETIME(JDK8)
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"));
DATEFORMATUTILS(COMMONS.LANG3)
DateFormatUtils.format(new Date(), "yyyyMMdd HH:mm:ss");
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
ORG.JODA.TIME.DATETIME
DateTime.now().toString("yyyyMMdd HH:mm:ss");
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
JMH微机准测试
*JMH微机准测试框架不清楚的可以自行Google*此次测试环境:本机cpu i7 2.6GHz
方式 | 吞吐ops/s |
---|---|
SimpleDateFormat | 811176 |
DateTime(joda) | 3677864 |
DateFormatUtils(commons-lang3) | 2684990 |
LocalDateTime(jdk8) | 1366451 |
测试结论
SimpleDateFormat性能最差,但是,平常我们不注意,却用得最多!
Joda对于当前时间的字符格式化性能最好,
DateFormatUtils其次。
但是对于指定时间进行格式化,Joda并不支持,所以功能有其局限性。
相比而言,DateFormatUtils功能相对丰富,静态方法使用简单,也是线程安全,可以说是我们编码时的第一选择。
以后,格式时间的时候,
请多使用DateFormatUtils (commons.lang3)
出现问题代码
机器信息:Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz 16.0 GB
Map<Integer, List<RocksTcSales>> collect = rocksTcSales.stream().filter(e -> e.getBusinessDate() != null).collect(Collectors.groupingBy(e -> {
String businessDate = e.getBusinessDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
if (dateTimeList.get(0).stream().anyMatch(item -> item.toDateStr().equals(businessDate))) {
//第一30天
return 0;
} else if (dateTimeList.get(1).stream().anyMatch(item -> item.toDateStr().equals(businessDate))) {
//第二个30天
return 1;
} else {
//第三个30天
return 2;
}
//每30天一组,并行处理
}));
代码耗时:13750ms
item.toDateStr()代码:return toString(DateUtil.newSimpleFormat(DatePattern.NORM_DATE_PATTERN, null, timeZone));
修改后代码:
ZoneId zoneId = ZoneId.systemDefault();
Map<Integer, List<RocksTcSales>> collect = rocksTcSales.stream().filter(e -> e.getBusinessDate() != null).collect(Collectors.groupingBy(e -> {
Instant instant = e.getBusinessDate().atStartOfDay().atZone(zoneId).toInstant();
Date from = Date.from(instant);
if (dateTimeList.get(0).stream().anyMatch(item -> item.compareTo(from) == 0)) {
//第一7天
return 0;
} else if (dateTimeList.get(1).stream().anyMatch(item -> item.compareTo(from) == 0)) {
//第二个7天
return 1;
} else {
//第三个7天
return 2;
}
//每7天一组,并行处理
}));
代码耗时:1000ms
修改前与修改后逻辑并不一样,但是确实是因为糟糕的循环处理暴露出 SimpleDateFormat的问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
- 最新
- 最热
查看全部