在论坛上闲逛无意间发现一条说SimpleDateFormat性能的帖子。之前并未关心过,也并不知道。读了下来才了解他引述的是Tim Cull发现SimpledataFormat创建实例时内存开销很大。这让我联想到了公司项目中资产设备运行不久就老是报内存溢出的错误。因为项目还未有过性能测试,因此我先猜测可能与这个有关,因为在项目中我们也大量使用了此类。因为没有安装性能测试工具,无法证实次论断的真实性,现在这里信之,后面做测试。经查找找到了Tim Cull的原文,贴在下面,他给出了一种解决方案,可供参考。
SimpleDateFormat: Performance Pig
BY TIM CULL
Just yesterday I came across this problem “in the wild” for the third time in my career so far: an application with performance problems creating tons of java.text.SimpleDateFormat instances. So, I have to get this out there: creating a new instance of SimpleDateFormat is incredibly expensive and should be minimized. In the case that prompted this post, I was using JProfiler to profile this code that parses a CSV file and discovered that 50% of the time it took to suck in the file and make 55,000 objects out of it was spent solely in the constructor of SimpleDateFormat. It created and then threw away a new one every time it had to parse a date. Whew!
“Great,” you think, “I’ll just create one, static instance, slap it in a field in a DateUtils helper class and life will be good.”
Well, more precisely, life will be good about 97% of the time. A few days after you roll that code into production you’ll discover the second cool fact that’s good to know: SimpleDateFormat is not thread safe. Your code will work just fine most of the time and all of your regression tests will probably pass, but once your system gets under a production load you’ll see the occasional exception.
“Fine,” you think, “I’ll just slap a ’synchronized’ around my use of that one, static instance.”
Ok, fine, you could do that and you’d be more or less ok, but the problem is that you’ve now taken a very common operation (date formatting and parsing) and crammed all of your otherwise-lovely, super-parallel application through a single pipe to get it done.
What would be better is to use a ThreadLocal variable so you can have your cake and eat it, too:
public class DateUtils {
public static final String MY_STANDARD_DATE_FORMAT = "yyyyMMdd";
public static java.util.Date parseDate(String dateString) throws ParseException {
return getFormat().parse(dateString);
}
private static ThreadLocal format = new ThreadLocal(){
protected synchronized Object initialValue() {
return new java.text.SimpleDateFormat(MY_STANDARD_DATE_FORMAT);
}
}
private static DateFormat getFormat(){
return (DateFormat) format.get();
}
}
I hope this code works because I wrote it on the fly and haven’t tried to run it, but you get the point.
文章地址:
http://www.thedwick.com/blog/2008/04/simpledateformat-performance-pig/
Tim Cull 博客:
http://www.thedwick.com/blog/
Tim Cull 文章:
http://www.infoq.com/cn/articles/java_legacy_systems
在网上查找了几篇相关文章:
http://www.iteye.com/topic/757641
http://hi.baidu.com/china8jie/blog/item/9452b50fa9bec0e3aa645735.html
分享到:
相关推荐
与此同时,描述中提到的“比simpleDateFormat性能高的java日期控件”可能指的是使用更高效的日期格式化库,如Java 8中的`java.time` API或者第三方库如Joda-Time。这些库提供了更好的性能和更简洁的API,对于频繁...
在处理复杂格式时,可能会有性能上的考虑,因为正则表达式在处理大量数据时可能会变得效率低下。此外,为了兼容性,这个实现可能还需要处理不同的区域设置和语言环境。 在实际项目中,除了自定义实现外,还可以考虑...
SimpleDateFormat 详解 SimpleDateFormat 是 Java 语言中的一种日期和时间格式化类,用于将日期和时间格式...通过合理地使用 SimpleDateFormat,我们可以实现日期和时间的高效格式化和解析,提高程序的性能和可读性。
SimpleDateFormat类的线程安全问题是因为它使用了缓存机制来提高解析和格式化的性能。缓存机制使用了一个缓存数组来存储解析和格式化的结果,但是这个缓存数组是共享的,这意味着在多线程环境中,多个线程可能会同时...
2. **缓存问题**:`SimpleDateFormat`在内部使用了缓存来提高性能,但这个缓存也是线程不安全的。在并发情况下,两个线程同时尝试修改或获取缓存的值,可能导致数据混乱。 3. **解析和格式化操作**:这两个操作不是...
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss"); // 创建时间对象 Date date = new Date(finalI * 1000); // 执行时间格式化并打印结果 System.out.println(simpleDateFormat.format(date...
这种方法虽然能够解决线程安全问题,但是会降低程序的并发性能。 2. **使用ThreadLocal**:对于每个线程创建独立的`SimpleDateFormat`实例,可以通过`ThreadLocal`实现。这样,每个线程都有自己的`SimpleDateFormat...
Java 8引入了`java.time`包,其中的`DateTimeFormatter`类提供了更现代且性能更好的日期时间格式化功能。它是线程安全的,并且提供了更多的日期时间格式选项。 在学习过程中,你可以通过提供的源代码实例深入理解...
在Java编程中,`...选择合适的策略来管理和使用`SimpleDateFormat`实例可以避免潜在的并发问题,保证程序的稳定性和性能。在实际开发中,根据项目需求和性能要求,可以选择上述的一种或多种方案来应对。
在性能要求较高的场景下,可以考虑使用`java.time`包中的`DateTimeFormatter`类,它是Java 8及更高版本引入的,提供了更高效且更易用的日期时间格式化功能。 总结来说,`SimpleDateFormat`是Java中处理日期和时间...
Java在并发环境中SimpleDateFormat多种解决方案 Java在并发环境中使用SimpleDateFormat时,可能会遇到线程安全问题。下面将介绍六种解决方案来解决这个问题。 方法一:使用局部变量 在需要执行格式化的地方都新建...
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日"); String formattedString = MessageFormat.format(pattern, name, dateFormat.format(currentDate)); System.out.println(formatted...
3. **性能优化**:频繁的日期格式化操作可能影响性能,可以考虑缓存`SimpleDateFormat`实例或使用`java.time`包的类,它们在性能上通常更好。 在实际应用中,我们还需要考虑到日期格式化的需求可能因业务场景不同而...
在Java编程中,日期和时间处理是常见...同时,`java.time`包在Java 8及以后版本提供了更现代和直观的日期时间API,如`LocalDate`、`LocalTime`和`LocalDateTime`等,它们在处理日期和时间时提供了更好的性能和可读性。
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); ``` 4. **类型绑定(Type Binding)**:处理复杂的数据结构,如集合和自定义类型,可以使用`@JsonTypeInfo`和`@JsonSubTypes`注解来实现。 ...
7. **Java 8及更高版本的新特性**:从Java 8开始,引入了`java.time`包,它提供了更现代且性能更好的日期时间API,如`LocalDate`, `LocalTime`, `LocalDateTime`等,以及`DateTimeFormatter`类,它们在处理日期和...
此外,`java.time`包在Java 8及更高版本中引入,提供了更现代、更易用的时间日期API,如`LocalDateTime`、`DateTimeFormatter`等,它们在性能和功能上都优于旧的API。 现在回到`DateUtil`工具类,这个类通常包含了...
在Java编程语言中,`...对于新项目,优先考虑使用`java.time`包中的类,如`DateTimeFormatter`,它们提供了更好的性能和线程安全性。通过理解这些概念和最佳实践,可以编写出更加健壮和高效的多线程Java应用。
3. **性能考虑**:如果频繁进行日期和字符串之间的转换,可以考虑使用线程安全的`DateTimeFormatter`类(Java 8及以上版本提供)来替代`SimpleDateFormat`,以提高程序的性能。 4. **国际化支持**:如果应用程序需要...
在Java编程语言中,处理日期和时间是常见的需求。...前者是旧API的一部分,后者是新API的核心组件,提供了更多功能和更好的性能。在编写Java程序时,根据项目需求和兼容性选择合适的方法进行日期格式化。