Hi, while looking through the code of String.split() and Pattern.split(), I wondered if we could get rid of the calls to list.subList(0, resultSize) if resultSize matches the size of the list. If that's the case, subList() seems redundant.
JMH Benchmarks in single-shot mode show the following results with a new revised version (attached below): Benchmark Mode Cnt Score Error Units MyBenchmark.testNew ss 10 12957,900 ± 7800,863 ns/op MyBenchmark.testNew:·gc.alloc.rate ss 10 6,248 ± 3,231 MB/sec MyBenchmark.testNew:·gc.alloc.rate.norm ss 10 1384,000 ± 0,001 B/op MyBenchmark.testNew:·gc.count ss 10 ? 0 counts MyBenchmark.testOld ss 10 25017,800 ± 19178,411 ns/op MyBenchmark.testOld:·gc.alloc.rate ss 10 4,887 ± 3,764 MB/sec MyBenchmark.testOld:·gc.alloc.rate.norm ss 10 1464,000 ± 0,001 B/op MyBenchmark.testOld:·gc.count ss 10 ? 0 counts Other benchmark modes show inconclusive results from the throughput perspective, yet it's clearly visible that less objects are allocated. Could anybody verify if that's a worthwhile improvement? And in case it is, potentially sponsor it? Thanks in advance. Cheers, Christoph ===== PATCH ===== diff -r 5e894b0f5e63 src/java.base/share/classes/java/lang/String.java --- a/src/java.base/share/classes/java/lang/String.java Fri Oct 19 16:29:45 2018 -0700 +++ b/src/java.base/share/classes/java/lang/String.java Sat Oct 20 18:49:02 2018 +0200 @@ -2315,6 +2315,9 @@ } } String[] result = new String[resultSize]; + if (list.size() == resultSize) { + return list.toArray(result); + } return list.subList(0, resultSize).toArray(result); } return Pattern.compile(regex).split(this, limit); diff -r 5e894b0f5e63 src/java.base/share/classes/java/util/regex/Pattern.java --- a/src/java.base/share/classes/java/util/regex/Pattern.java Fri Oct 19 16:29:45 2018 -0700 +++ b/src/java.base/share/classes/java/util/regex/Pattern.java Sat Oct 20 18:49:02 2018 +0200 @@ -1293,6 +1293,9 @@ while (resultSize > 0 && matchList.get(resultSize-1).equals("")) resultSize--; String[] result = new String[resultSize]; + if (matchList.size() == resultSize) { + return matchList.toArray(result); + } return matchList.subList(0, resultSize).toArray(result); }