]
Koen Janssens updated LOGMGR-157:
---------------------------------
Attachment: DateFormatPerformance.java
Provide faster alternative to SimpleDataFormat
----------------------------------------------
Key: LOGMGR-157
URL:
https://issues.jboss.org/browse/LOGMGR-157
Project: JBoss Log Manager
Issue Type: Enhancement
Components: core
Affects Versions: 2.0.6.Final
Reporter: Koen Janssens
Attachments: DateFormatPerformance.java
Whenever a data or timestamp is included in the logging pattern, SimpleDataFormat is used
for formatting. Even with one instance per thread, it is still a heavy beast.
Other logging libraries (like the 15 year old log4j) have 'fast tracks' for known
formats such as ISO 8601. These implementations are faster and generate less memory
garbage.
During profiling, i discovered that simpledateformat is doing a lot of stuff while
printing a date:
at java.lang.Thread.run(Thread.java:748)
at org.jboss.logmanager.handlers.AsyncHandler$AsyncTask.run(AsyncHandler.java:196)
at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:76)
at org.jboss.logmanager.handlers.WriterHandler.doPublish(WriterHandler.java:46)
at org.jboss.logmanager.ExtFormatter.format(ExtFormatter.java:32)
at
org.jboss.logmanager.formatters.MultistepFormatter.format(MultistepFormatter.java:83)
at
org.jboss.logmanager.formatters.Formatters$JustifyingFormatStep.render(Formatters.java:224)
at org.jboss.logmanager.formatters.Formatters$5.renderRaw(Formatters.java:389)
at java.text.DateFormat.format(DateFormat.java:345)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966)
at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1125)
at java.util.Calendar.getDisplayName(Calendar.java:2110)
at java.text.DateFormatSymbols.getInstance(DateFormatSymbols.java:340)
at java.text.DateFormatSymbols.getProviderInstance(DateFormatSymbols.java:364)
at
sun.util.locale.provider.DateFormatSymbolsProviderImpl.getInstance(DateFormatSymbolsProviderImpl.java:85)
at java.text.DateFormatSymbols.<init>(DateFormatSymbols.java:145)
at java.text.DateFormatSymbols.initializeData(DateFormatSymbols.java:710)
at sun.util.resources.LocaleData.getDateFormatData(LocaleData.java:127)
at sun.util.resources.LocaleData.getBundle(LocaleData.java:163)
at java.security.AccessController.doPrivileged(Native Method)
at sun.util.resources.LocaleData$1.run(LocaleData.java:163)
at sun.util.resources.LocaleData$1.run(LocaleData.java:167)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:890)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1348)
at java.util.ResourceBundle.checkList(ResourceBundle.java:1400)
at java.util.Collections$UnmodifiableCollection.isEmpty(Collections.java:1031)
at java.util.AbstractCollection.isEmpty(AbstractCollection.java:86)
I have attached a small comparision between simpledateformat performance and log4j ISO
formatting performance. It roughly a factor 10 'faster'