> Instead of allocating a copy of underlying array via
> `CharArrayWriter.toCharArray()` and passing it to constructor of String
> String str = new String(charArrayWriter.toCharArray());
> we could call `toString()` method
> String str = charArrayWriter.toString();
> decoding existing char[] without making a copy. This slightly speeds up the
> method reducing at the same time memory consumption for decoding URLs with
> non-latin symbols:
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
> public class UrlEncoderBenchmark {
> private static final Charset charset = Charset.defaultCharset();
> private static final String utf8Url =
> "https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций"; // UN
>
> @Benchmark
> public String encodeUtf8() {
> return URLEncoder.encode(utf8Url, charset);
> }
> }
> The benchmark on my maching give the following output:
> before
> Benchmark Mode Cnt
> Score Error Units
> UrlEncoderBenchmark.encodeUtf8 avgt 100
> 1166.378 ± 8.411 ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate avgt 100
> 932.944 ± 6.393 MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm avgt 100
> 1712.193 ± 0.005 B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space avgt 100
> 929.221 ± 24.268 MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm avgt 100
> 1705.444 ± 43.235 B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space avgt 100
> 0.006 ± 0.001 MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm avgt 100
> 0.011 ± 0.002 B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt 100
> 652.000 counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time avgt 100
> 334.000 ms
>
> after
> Benchmark Mode Cnt
> Score Error Units
> UrlEncoderBenchmark.encodeUtf8 avgt 100
> 1058.851 ± 6.006 ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate avgt 100
> 931.489 ± 5.182 MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm avgt 100
> 1552.176 ± 0.005 B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space avgt 100
> 933.491 ± 24.164 MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm avgt 100
> 1555.488 ± 39.204 B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space avgt 100
> 0.006 ± 0.001 MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm avgt 100
> 0.010 ± 0.002 B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count avgt 100
> 655.000 counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time avgt 100
> 333.000 ms
Сергей Цыпанов has updated the pull request with a new target base due to a
merge or a rebase. The incremental webrev excludes the unrelated changes
brought in by the merge/rebase. The pull request contains four additional
commits since the last revision:
- 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset) - small
JavaDoc fix
- Merge branch 'master' into enc
- Merge branch 'master' into enc
- Improve URLEncoder.encode(String, Charset)
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/1598/files
- new: https://git.openjdk.java.net/jdk/pull/1598/files/2856c923..ae293c8b
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=1598&range=01
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=1598&range=00-01
Stats: 31439 lines in 1018 files changed: 11701 ins; 8302 del; 11436 mod
Patch: https://git.openjdk.java.net/jdk/pull/1598.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/1598/head:pull/1598
PR: https://git.openjdk.java.net/jdk/pull/1598