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 ------------- Commit messages: - 8292698: Improve performance of reading from DataInputStream Changes: https://git.openjdk.org/jdk/pull/9956/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9956&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8292698 Stats: 85 lines in 2 files changed: 76 ins; 0 del; 9 mod Patch: https://git.openjdk.org/jdk/pull/9956.diff Fetch: git fetch https://git.openjdk.org/jdk pull/9956/head:pull/9956 PR: https://git.openjdk.org/jdk/pull/9956