[
https://issues.apache.org/jira/browse/LOG4J2-1128?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gary Gregory updated LOG4J2-1128:
---------------------------------
Description:
Also reuse a StringBuilder to improve performance for other String-based
layouts: CSV, GELF, HTML, RFC524, Syslog.
XML and JSON are not included because they use Jackson.
----
As part of the investigation for LOG4J2-930 (PatternLayout performance), I
found that in PatternLayout.toSerializable(), instead of creating a new
StringBuilder each time this method is called, caching and reusing a
ThreadLocal<StringBuilder> makes a huge difference in performance.
*Before (new StringBuilder instance for each event)*
{code}
Benchmark Mode Samples
Score Error Units
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2 sample 125646
1413.362 ± 33.806 ns/op
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback sample 128680
1383.201 ± 33.076 ns/op
{code}
*After (reuse ThreadLocal<StringBuilder>)*
{code}
Benchmark Mode Samples
Score Error Units
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2 sample 156816
1138.547 ± 20.290 ns/op
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback sample 127978
1355.166 ± 19.462 ns/op
{code}
org.apache.logging.log4j.PerformanceComparison results indicate this improves
overall performance:
*Before (new StringBuilder instance for each event)*
{code}
Log4j : 1501
Logback : 1208
Log4j 2.0: 1646
###############################################
Log4j : 1487
Logback : 1165
Log4j 2.0: 1566
###############################################
Log4j : 1490
Logback : 1170
Log4j 2.0: 1485
###############################################
Log4j : 1392
Logback : 1143
Log4j 2.0: 1629
{code}
*After (reuse ThreadLocal<StringBuilder>)*
{code}
Log4j : 1498
Logback : 1202
Log4j 2.0: 1213
###############################################
Log4j : 1394
Logback : 1057
Log4j 2.0: 1290
###############################################
Log4j : 1240
Logback : 1109
Log4j 2.0: 1335
###############################################
Log4j : 1310
Logback : 1146
Log4j 2.0: 1210
{code}
There are more changes for LOG4J2-930, so I am splitting off this item into a
separate ticket so I can address it and close it.
was:
As part of the investigation for LOG4J2-930 (PatternLayout performance), I
found that in PatternLayout.toSerializable(), instead of creating a new
StringBuilder each time this method is called, caching and reusing a
ThreadLocal<StringBuilder> makes a huge difference in performance.
*Before (new StringBuilder instance for each event)*
{code}
Benchmark Mode Samples
Score Error Units
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2 sample 125646
1413.362 ± 33.806 ns/op
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback sample 128680
1383.201 ± 33.076 ns/op
{code}
*After (reuse ThreadLocal<StringBuilder>)*
{code}
Benchmark Mode Samples
Score Error Units
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2 sample 156816
1138.547 ± 20.290 ns/op
o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback sample 127978
1355.166 ± 19.462 ns/op
{code}
org.apache.logging.log4j.PerformanceComparison results indicate this improves
overall performance:
*Before (new StringBuilder instance for each event)*
{code}
Log4j : 1501
Logback : 1208
Log4j 2.0: 1646
###############################################
Log4j : 1487
Logback : 1165
Log4j 2.0: 1566
###############################################
Log4j : 1490
Logback : 1170
Log4j 2.0: 1485
###############################################
Log4j : 1392
Logback : 1143
Log4j 2.0: 1629
{code}
*After (reuse ThreadLocal<StringBuilder>)*
{code}
Log4j : 1498
Logback : 1202
Log4j 2.0: 1213
###############################################
Log4j : 1394
Logback : 1057
Log4j 2.0: 1290
###############################################
Log4j : 1240
Logback : 1109
Log4j 2.0: 1335
###############################################
Log4j : 1310
Logback : 1146
Log4j 2.0: 1210
{code}
There are more changes for LOG4J2-930, so I am splitting off this item into a
separate ticket so I can address it and close it.
> Reuse StringBuilder to improve performance for String-based layouts
> -------------------------------------------------------------------
>
> Key: LOG4J2-1128
> URL: https://issues.apache.org/jira/browse/LOG4J2-1128
> Project: Log4j 2
> Issue Type: Improvement
> Components: Layouts
> Affects Versions: 2.3
> Reporter: Remko Popma
> Assignee: Remko Popma
> Fix For: 2.4
>
>
> Also reuse a StringBuilder to improve performance for other String-based
> layouts: CSV, GELF, HTML, RFC524, Syslog.
> XML and JSON are not included because they use Jackson.
> ----
> As part of the investigation for LOG4J2-930 (PatternLayout performance), I
> found that in PatternLayout.toSerializable(), instead of creating a new
> StringBuilder each time this method is called, caching and reusing a
> ThreadLocal<StringBuilder> makes a huge difference in performance.
> *Before (new StringBuilder instance for each event)*
> {code}
> Benchmark Mode Samples
> Score Error Units
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2 sample 125646
> 1413.362 ± 33.806 ns/op
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback sample 128680
> 1383.201 ± 33.076 ns/op
> {code}
> *After (reuse ThreadLocal<StringBuilder>)*
> {code}
> Benchmark Mode Samples
> Score Error Units
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2 sample 156816
> 1138.547 ± 20.290 ns/op
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback sample 127978
> 1355.166 ± 19.462 ns/op
> {code}
> org.apache.logging.log4j.PerformanceComparison results indicate this improves
> overall performance:
> *Before (new StringBuilder instance for each event)*
> {code}
> Log4j : 1501
> Logback : 1208
> Log4j 2.0: 1646
> ###############################################
> Log4j : 1487
> Logback : 1165
> Log4j 2.0: 1566
> ###############################################
> Log4j : 1490
> Logback : 1170
> Log4j 2.0: 1485
> ###############################################
> Log4j : 1392
> Logback : 1143
> Log4j 2.0: 1629
> {code}
> *After (reuse ThreadLocal<StringBuilder>)*
> {code}
> Log4j : 1498
> Logback : 1202
> Log4j 2.0: 1213
> ###############################################
> Log4j : 1394
> Logback : 1057
> Log4j 2.0: 1290
> ###############################################
> Log4j : 1240
> Logback : 1109
> Log4j 2.0: 1335
> ###############################################
> Log4j : 1310
> Logback : 1146
> Log4j 2.0: 1210
> {code}
> There are more changes for LOG4J2-930, so I am splitting off this item into a
> separate ticket so I can address it and close it.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]