• 欢迎访问本站,本站记录博主日常编程遇到的问题,知识,惊奇软件等。如有问题还请留言


    Deprecated: strip_tags(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/gschaos.club/wp-content/themes/Git-alpha-6h0SRk/header.php on line 294

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

java mysticalycc 2年前 (2023-07-17) 1233次浏览 已收录 1个评论
文章目录[隐藏]

【性能测试篇】你现在用的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的问题。


MysticalYcc , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【性能测试篇】你现在用的SIMPLEDATEFORMAT类性能最差!
喜欢 (0)
mysticalycc
关于作者:
简短的个人签名

Warning: Undefined variable $comment_i in /www/wwwroot/gschaos.club/wp-content/themes/Git-alpha-6h0SRk/comments.php on line 7
mysticalycc
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到
(1)个小伙伴在吐槽
  1. mysticalycc
    就是我写的
    mysticalycc2023-08-25 17:48 回复