【性能测试篇】你现在用的SIMPLEDATEFORMAT类性能最差!

【性能测试篇】你现在用的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
喜欢就支持一下吧
点赞9 分享
评论 共1条

请登录后发表评论