RFR: 8292698: Improve performance of DataInputStream [v2]
Сергей Цыпанов
duke at openjdk.org
Sun Aug 21 14:40:25 UTC 2022
> 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 incrementally with one additional commit since the last revision:
8292698: Revert dubious changes
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/9956/files
- new: https://git.openjdk.org/jdk/pull/9956/files/31a9c451..a2378ded
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=9956&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=9956&range=00-01
Stats: 3 lines in 1 file changed: 0 ins; 3 del; 0 mod
Patch: https://git.openjdk.org/jdk/pull/9956.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/9956/head:pull/9956
PR: https://git.openjdk.org/jdk/pull/9956
More information about the core-libs-dev
mailing list