On Mon, 29 Aug 2022 08:46:20 GMT, Сергей Цыпанов <d...@openjdk.org> wrote:
>> I found out that reading from `DataInputStream` wrapping >> `ByteArrayInputStream` (as well as `BufferedInputStream` or any >> `InputStream` relying on `byte[]`) can be significantly improved by >> accessing volatile `in` field only once per operation. >> >> Current implementation does it for each call of `in.read()`, i.e. in >> `readInt()` method we do it 4 times: >> >> public final int readInt() throws IOException { >> int ch1 = in.read(); >> int ch2 = in.read(); >> int ch3 = in.read(); >> int ch4 = in.read(); >> if ((ch1 | ch2 | ch3 | ch4) < 0) >> throw new EOFException(); >> return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); >> } >> >> Apparently accessing volatile reference with underlying `byte[]` prevents >> runtime from doing some optimizations, so dereferencing local variable >> should be more efficient. >> >> Benchmarking: >> >> baseline: >> >> Benchmark Mode Cnt Score Error Units >> DataInputStreamTest.readChar avgt 20 22,889 ± 0,648 us/op >> DataInputStreamTest.readInt avgt 20 21,804 ± 0,197 us/op >> >> patch: >> >> Benchmark Mode Cnt Score Error Units >> DataInputStreamTest.readChar avgt 20 11,018 ± 0,089 us/op >> DataInputStreamTest.readInt avgt 20 5,608 ± 0,087 us/op > > Сергей Цыпанов 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 five additional > commits since the last revision: > > - 8292698: Reuse existing code > - Merge branch 'master' into 8292698 > - 8292698: Fix copyright year > - 8292698: Revert dubious changes > - 8292698: Improve performance of reading from DataInputStream Btw, the changes is quite simple, so could it be backported to JDK11 and JDK17 updates? ------------- PR: https://git.openjdk.org/jdk/pull/9956