下午在代码review时,和Y同学讨论了SimpleDateFormat的使用,发现自己以前使用有不当的地方,特此记录。

在jdk的doc中指出SimpleDateFormat

Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

之前使用的时候,直接new一个,没有考虑到多线程问题,在并发的情况下会有问题。

public static DateFormat dataTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
考虑到该方法在工程中用的比较多,测试了几种常用方法的性能, 测试场景:单线程多次format , 数据如下:
次数:10w
jdkSimpleDataFormat cost time: 1115ms
apacheSimpleDataFormat cost time: 275ms
threadLocalSimpleDataFormat cost time: 183ms
次数:100w
jdkSimpleDataFormat cost time: 4737ms
apacheSimpleDataFormat cost time: 1572ms
threadLocalSimpleDataFormat cost time: 853ms
次数:1000w
jdkSimpleDataFormat cost time: 35170ms
apacheSimpleDataFormat cost time: 14078ms
threadLocalSimpleDataFormat cost time: 8509ms
从数据可以看出
(1) apache common-lang提供的DateFormatUtils.format方法比JDK提供的SimpleDataFormat.format性能高出 149.82%
(2) ThreadLocal方式比 DateFormatUtils.format 方式性能高出 65.44%

结论:在使用SimpleDataFormat时,尽量使用ThreadLocal 方式。

测试代码如下,有兴趣的同学可以测下多线程情形下的性能数据。
package com.bc.perf;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;import org.apache.commons.lang.time.DateFormatUtils;public class SimpleDataFormatPerfTest {private static final int circleNum = 10000000;private static String pattern = "yyyy-MM-dd HH:mm:ss";private Executor testExecutor = Executors.newFixedThreadPool(64);private static ThreadLocal<SimpleDateFormat> simpleDateFormatProvider = new ThreadLocal<SimpleDateFormat>() {@Overrideprotected SimpleDateFormat initialValue() {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}};public static void main(String[] args){SimpleDataFormatPerfTest test = new SimpleDataFormatPerfTest();SimpleDateFormat format = new SimpleDateFormat(pattern);System.out.println("jdkSimpleDataFormat date format: " + format.format(new Date()));System.out.println("apacheSimpleDataFormat date format: " + DateFormatUtils.format(new Date(), pattern));System.out.println("threadLocalSimpleDataFormat date format: " + simpleDateFormatProvider.get().format(new Date()));//1 Jdk SimpleDateFormattest.jdkSimpleDataFormatPerf();//2 Apache common-lang SimpleDateFormattest.apacheSimpleDataFormatPerf();//3 ThreadLocal SimpleDateFormattest.threadLocalSimpleDataFormatPerf();}public void jdkSimpleDataFormatPerf() {long t1 = System.currentTimeMillis();for (int i = 0; i < circleNum; i++) {SimpleDateFormat format = new SimpleDateFormat(pattern);format.format(new Date());}long t2 = System.currentTimeMillis();System.out.println("originSimpleDataFormat cost time: " + (t2 - t1));}public void apacheSimpleDataFormatPerf() {long t1 = System.currentTimeMillis();for (int i = 0; i < circleNum; i++) {DateFormatUtils.format(new Date(), pattern);}long t2 = System.currentTimeMillis();System.out.println("apacheSimpleDataFormat cost time: " + (t2 - t1));}public void threadLocalSimpleDataFormatPerf() {long t1 = System.currentTimeMillis();for (int i = 0; i < circleNum; i++) {simpleDateFormatProvider.get().format(new Date());}long t2 = System.currentTimeMillis();System.out.println("threadLocalSimpleDataFormat cost time: " + (t2 - t1));}
}

关于SimpleDateFormat的一些使用及性能数据相关推荐

  1. 【java 性能优化实战】3 工具实践:如何获取代码性能数据?

    首先解答一下上一课时的问题.磁盘的速度这么慢,为什么 Kafka 操作磁盘,吞吐量还能那么高? 这是因为,磁盘之所以慢,主要就是慢在寻道的操作上面.Kafka 官方测试表明,这个寻道时间长达 10ms ...

  2. 通过ngx-lua来统计Nginx上的虚拟主机性能数据

    Web server调研分析 Filed under: Web Server - cmpan @ 2012-10-29 20:38:34 摘要 简单可依赖的架构首先需要有一个简单可依赖的前端WebSe ...

  3. windows下磁盘IO性能数据评测

    windows下如何查看磁盘IO性能 http://www.51testing.com/?uid-211722-action-viewspace-itemid-233892 服务器性能瓶颈如何判断.C ...

  4. linux环境安装nagiosgraph将nagios的性能数据绘制成动态图表?

    需求描述: 在安装完成nagios之后,比如有监控磁盘负载信息的,连接数的,进程数的,可以通过安装nagiosgraph软件, 将nagios的性能数据绘制成图表,可以看到一段时间内数据的变化 环境说 ...

  5. 使用ST03N查看指定user的transaction 性能数据

    Created by Jerry Wang, last modified on Aug 04, 2014 使用tcode ST03N,双击Workload->Total, 展开User and ...

  6. linux历史性能数据,Linux平台下如何看OS历史的性能数据

    同事电话询问Linux下一个集群内2个主机前后2天相继无响应,表现状况为ping都没响应. 因为没任何监控或其他性能数据,故需要获取历史OS性能数据. 我们知道rhel5,6下默认可以通过sar命令查 ...

  7. .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)...

    大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...

  8. check_mk自定义监控增加性能数据图形展示

    在nagios中可以实现性能图形展示,利用的是PNP4Nagios,check_mk当然也可以,而且很简单. 这篇文章在前一篇文章<check_mk自定义监控实践之powershell>的 ...

  9. 使用SMMU的PMU查看性能数据

    使用SMMU的PMU查看性能数据 -v0.1 Sherlock 2019.9.28 init ARM的SMMU提供了性能相关的统计寄存器(Performance Monitor Counter Gro ...

  10. Java 性能优化实战工具实践:如何获取代码性能数据?

    首先解答一下上一课时的问题.磁盘的速度这么慢,为什么 Kafka 操作磁盘,吞吐量还能那么高? 这是因为,磁盘之所以慢,主要就是慢在寻道的操作上面.Kafka 官方测试表明,这个寻道时间长达 10ms ...

最新文章

  1. 计算机视觉训练模型效果不佳怎么破?
  2. oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
  3. a1708硬盘转接口_2015年A1502 Macbook Pro更换硬盘
  4. [转]F# Samples 101 - Visual Studio 2010
  5. 2017.3.23下午
  6. 链表题目---3 合并两个有序单链表 和 分割链表
  7. jquery和easui学习总结_jQuery EasyUI总结
  8. Memcached主主复制+Keepalived高可用架构
  9. 408中的计算机组成原理,2021考研计算机大纲408计算机组成原理部分原文解析
  10. 小程序 switch 自定义_微信小程序自定义组件问题一:获取组件DOM元素
  11. 微软王码五笔86版 for win95/98/me 官网
  12. NDP调查:P2P下载的视频中60%为情色内容
  13. 机器人国际会议与期刊列表
  14. Mac QuickTime+Soundflower录屏
  15. SMS之SMS2003+SP3
  16. 一个苏州IT人的5年挨踢经历-------面试,薪资,企业,经历全方位揭示(之二)
  17. python编程培训杭州
  18. 最强大脑《多米诺效应》
  19. sinh和asinh--双曲正弦和反双曲正弦函数
  20. 使用ingress代理mysql数据库

热门文章

  1. paip.提高开发效率----自动数据库SQL备份
  2. joinquant : 通过query获取申万各级指数行情、估值等数据
  3. 呼之欲出的“7万亿”往哪儿去?
  4. Rust : future库
  5. Julia: 如何转换PyPlot的X轴的日期格式?
  6. 【力学】基于matlab立铣刀力模拟仿真【含Matlab源码 193期】
  7. 毕设题目:Matlab无人机协同任务
  8. 【优化算法】人工蜂鸟优化算法(AHA)【含Matlab源码 1470期】
  9. 【交通标志识别】基于matlab GUI SIFT交通标志识别【含Matlab源码 864期】
  10. 【优化调度】基于matlab人工鱼群算法求解梯级水库调度优化问题【含Matlab源码 415期】