logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Remko Popma (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LOG4J2-935) Performance: which String.getBytes method to use
Date Sat, 03 Oct 2015 21:45:27 GMT

    [ https://issues.apache.org/jira/browse/LOG4J2-935?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14942470#comment-14942470
] 

Remko Popma commented on LOG4J2-935:
------------------------------------

I was just stunned to find that half of the processing time required to format a LogEvent
to a byte[] array is taken by converting the intermediate String to the eventual byte[] array.


533 ns LogEvent to String (with object pool)
1147 ns LogEvent to String to byte[] array (object pool): an additional 600 nanos for the
String->byte[] conversion

I did not mean to suggest anything yet. It just smells like there is an opportunity for a
big improvement here so I wanted to record these numbers as a note to myself. I need to do
more research on this.

> Performance: which String.getBytes method to use
> ------------------------------------------------
>
>                 Key: LOG4J2-935
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-935
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: Appenders, Core
>    Affects Versions: 2.1
>            Reporter: Remko Popma
>
> I did some investigation to compare the performance of {{String.getBytes(String)}} to
{{String.getBytes(Charset)}} and it turns out that the String variant is significantly faster
(at least on Windows 7 and Solaris 10).
> I am not sure what causes this but the code path for {{String.getBytes(Charset)}} leads
to {{java.lang.StringCoding.encode(Charset, char[], int, int)}} which creates a new {{StringEncoder}}
for each invocation. By contrast, {{String.getBytes(String)}} leads to {{java.lang.StringCoding.encode(String,
char[], int, int)}} which uses a cached {{StringEncoder}} (at least in Java 6 and 7). This
may be one reason.
> I also compared Java 6, 7 and 8. Note that with each upgrade performance is getting better,
with a huge jump in Java 8 for ISO-8859-1 (I suspect this is done by simply casting each char
to a byte, dropping the 8 most significant bits of each 16-bit char).
> Benchmark results follow below, sorted by throughput (best first).
> {{java -jar benchmarks.jar ".\*StringEncodingBenchmark.\*" -f 1 -t 1 -wi 5 -i 5}}
> *Windows 7 (64bit) 2-core Intel i5-2500 CPU @3.30Ghz*
> {noformat}
> jdk1.6.0_45
> Benchmark                                                  Mode  Samples         Score
      Error Units
> o.a.l.l.p.j.StringEncBenchmark.GetBytesString88591        thrpt        5  12967053.847
± 80324.398  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSet88591       thrpt        5   6816575.144
± 50311.921  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytes                   thrpt        5   3431255.953
± 51075.510  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringDefault      thrpt        5   3356148.444
± 29690.404  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringShiftJIS     thrpt        5   3339120.398
± 13213.076  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetDefault     thrpt        5   1637800.057
± 12736.976  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetShiftJIS    thrpt        5   1516240.836
± 12076.700  ops/s
> jdk1.7.0_55
> Benchmark                                                  Mode  Samples         Score
       Error  Units
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSet88591       thrpt        5  13515690.815
± 579537.298  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesString88591        thrpt        5  10818301.339
±  60140.387  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringDefault      thrpt        5   4713065.699
±  73247.202  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytes                   thrpt        5   4587139.396
± 109611.806  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetDefault     thrpt        5   3629802.089
±  38100.113  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringShiftJIS     thrpt        5   3388620.097
±  37114.869  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetShiftJIS    thrpt        5   2024599.702
±  46543.717  ops/s
> jdk1.8.0_25
> Benchmark                                                  Mode  Samples         Score
       Error  Units
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSet88591       thrpt        5  52009871.813
± 502287.883  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesString88591        thrpt        5  26618044.840
± 236755.306  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytes                   thrpt        5   5342101.771
±  39781.910  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringDefault      thrpt        5   5281169.402
±  55524.193  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringShiftJIS     thrpt        5   5276164.715
± 100823.625  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetShiftJIS    thrpt        5   4279903.988
±  49535.013  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetDefault     thrpt        5   3858350.559
±  70966.741  ops/s
> {noformat}
> *Solaris 10 (64bit) 4-core Xeon X5570 dual CPU @2.93Ghz*
> {noformat}
> jdk1.6.0_20
> Benchmark                                                  Mode  Samples        Score
       Error  Units
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringDefault      thrpt        5  7736847.092
±  51274.226  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytes                   thrpt        5  7421582.562
±  76260.755  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesString88591        thrpt        5  6829890.456
± 189812.619  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetDefault     thrpt        5  6811579.239
± 148393.528  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSet88591       thrpt        5  3921075.542
±  38000.495  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringShiftJIS     thrpt        5  2309217.326
±  20982.591  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetShiftJIS    thrpt        5  1029117.710
±  14768.961  ops/s
> jdk1.7.0_06
> Benchmark                                                  Mode  Samples         Score
       Error  Units
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetDefault     thrpt        5  12028518.507
±  93571.792  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytes                   thrpt        5  11548051.157
±  45019.349  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringDefault      thrpt        5  11033635.427
± 103410.346  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSet88591       thrpt        5   4950536.544
±  44039.456  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesString88591        thrpt        5   4161493.706
±  31591.263  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringShiftJIS     thrpt        5   2312330.720
±   9396.859  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetShiftJIS    thrpt        5   1312534.481
±  26186.142  ops/s
> jdk1.8.0_11
> Benchmark                                                  Mode  Samples         Score
       Error  Units
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSet88591       thrpt        5  33946446.764
± 933451.351  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesString88591        thrpt        5  20917837.751
± 257779.242  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringDefault      thrpt        5  13328817.946
± 151911.634  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytes                   thrpt        5  13096046.662
±  77208.908  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetDefault     thrpt        5  12356403.648
± 170268.254  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesStringShiftJIS     thrpt        5   4261255.777
±  33116.543  ops/s
> o.a.l.l.p.j.StringEncBenchmark.GetBytesCharSetShiftJIS    thrpt        5   3478309.565
±  78097.111  ops/s
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org


Mime
View raw message