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

Anyone to sponsor, or should I get more approves?

-------------

PR: https://git.openjdk.org/jdk/pull/9956

Reply via email to