You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by "Remko Popma (JIRA)" <ji...@apache.org> on 2015/10/05 01:39:26 UTC

[jira] [Assigned] (LOG4J2-935) Performance: which String.getBytes method to use

     [ https://issues.apache.org/jira/browse/LOG4J2-935?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Remko Popma reassigned LOG4J2-935:
----------------------------------

    Assignee: Remko Popma

> 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
>            Assignee: 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