Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8292698

Improve performance of DataInputStream

    XMLWordPrintable

Details

    • b20

    Backports

      Description

        I found out that reading from DataInputStream wrapping ByteArrayInputStream 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

        Attachments

          Issue Links

            Activity

              People

                stsypanov Sergey Tsypanov
                stsypanov Sergey Tsypanov
                Votes:
                0 Vote for this issue
                Watchers:
                6 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: