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

The tests for endianess for DataInputStream are in the TCK and would have 
caught this case.
Tests for endianess are not duplicated in the jtreg test suite.

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

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

Reply via email to