RFR: 8292698: Improve performance of DataInputStream [v4]
Сергей Цыпанов
duke at openjdk.org
Wed Oct 5 15:26:28 UTC 2022
On Mon, 29 Aug 2022 08:46:20 GMT, Сергей Цыпанов <duke at 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
Anyone to sponsor, or should I get more approves?
-------------
PR: https://git.openjdk.org/jdk/pull/9956
More information about the core-libs-dev
mailing list