On Mon, 31 Oct 2022 09:52:06 GMT, Alan Bateman <al...@openjdk.org> wrote:
> > **TL;DR:** Your optimization is now contained in this PR and outperforms > > the previous code. Nevertheless I plead for Alternative C (double > > buffering) instead, which is even faster but much simpler. > You had dismissed this previously so it's useful to have results now to > compare. I agree it's much simpler, it can probably use Arrays.copyOfRange > too. Sorry for that. Unless I actually tested, I was unaware how slow Alternative B actually is (in fact it was quite surprising that `Arrays.fill` apparently is implemented in pure Java while `System.arraycopy` is native). So let's go on with Alternative C + `Arrays.copyOfRange`! :-) > For the results, can you say what the underlying input stream is and what the > target output stream is? Also it would be useful to get a baseline. I suspect > you have that, it's just not pasted in the table above. The underlying input stream is `ByteArrayInputStream` wrapping 1 MB byte array, the output stream is `ByteArrayOutputStream`. So the test is not I/O-bound, hence it is clearly focusing on the actual difference Alternatives B/C. Yes, I do have a baseline. It is the original code without *any* safety against poisoning and leaking and the numbers are shown below. I have not published it before, because they are not perfectly comparable: A Windows Update happened after the above runs, and before this run, and my laptop feels to behave somewhat different since then. Sorry for that, but I had no time to repeat the full four hours test suite, and I think the numbers are good enough for our decision pro Alternative C. Benchmark (bufSize) (posPercent) Mode Cnt Score Error Units BufferedInputStreamTransferToPerformance.transferTo 8192 0 thrpt 25 4197,126 ┬▒ 627,973 ops/s BufferedInputStreamTransferToPerformance.transferTo 8192 10 thrpt 25 2615,802 ┬▒ 251,678 ops/s BufferedInputStreamTransferToPerformance.transferTo 8192 90 thrpt 25 3140,941 ┬▒ 575,787 ops/s BufferedInputStreamTransferToPerformance.transferTo 8192 100 thrpt 25 4603,691 ┬▒ 12,127 ops/s BufferedInputStreamTransferToPerformance.transferTo 1048576 0 thrpt 25 3539,737 ┬▒ 59,913 ops/s BufferedInputStreamTransferToPerformance.transferTo 1048576 10 thrpt 25 4790,750 ┬▒ 63,090 ops/s BufferedInputStreamTransferToPerformance.transferTo 1048576 90 thrpt 25 43273,624 ┬▒ 1784,369 ops/s BufferedInputStreamTransferToPerformance.transferTo 1048576 100 thrpt 25 1693553,210 ┬▒ 21249,108 ops/s ------------- PR: https://git.openjdk.org/jdk/pull/10525