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

Improve performance of DataInputStream

XMLWordPrintable

    • b20

        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

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

                Created:
                Updated:
                Resolved: