On Fri, 26 Aug 2022 12:10:58 GMT, Сергей Цыпанов <d...@openjdk.org> wrote:
>> Currently some operations of RandomAccessFile are implemented with multiple >> read() invocations: >> >> public final int readInt() throws IOException { >> int ch1 = this.read(); >> int ch2 = this.read(); >> int ch3 = this.read(); >> int ch4 = this.read(); >> if ((ch1 | ch2 | ch3 | ch4) < 0) >> throw new EOFException(); >> return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); >> } >> >> This can be improved by using bulk reads: >> >> public final int readInt() throws IOException { >> readFully(readBuffer, 0, 4); >> return Bits.getInt(readBuffer, 0); >> } >> >> Benchmarking: >> >> baselile >> Benchmark (kiloBytes) Mode Cnt Score >> Error Units >> RandomAccessFileReadBenchmark.readInt 1 avgt 10 1060,526 ± >> 62,036 us/op >> RandomAccessFileReadBenchmark.readInt 5 avgt 10 5745,671 ± >> 1374,277 us/op >> RandomAccessFileReadBenchmark.readLong 1 avgt 10 1399,494 ± >> 378,072 us/op >> RandomAccessFileReadBenchmark.readLong 5 avgt 10 4864,425 ± >> 329,282 us/op >> RandomAccessFileReadBenchmark.readShort 1 avgt 10 1111,163 ± >> 70,883 us/op >> RandomAccessFileReadBenchmark.readShort 5 avgt 10 4933,058 ± >> 339,273 us/op >> >> patch >> Benchmark (kiloBytes) Mode Cnt Score >> Error Units >> RandomAccessFileReadBenchmark.readInt 1 avgt 10 311,404 ± >> 17,337 us/op >> RandomAccessFileReadBenchmark.readInt 5 avgt 10 1210,381 ± >> 22,742 us/op >> RandomAccessFileReadBenchmark.readLong 1 avgt 10 201,726 ± >> 8,885 us/op >> RandomAccessFileReadBenchmark.readLong 5 avgt 10 667,117 ± >> 6,779 us/op >> RandomAccessFileReadBenchmark.readShort 1 avgt 10 560,259 ± >> 16,783 us/op >> RandomAccessFileReadBenchmark.readShort 5 avgt 10 2251,975 ± >> 54,533 us/op > > Сергей Цыпанов has updated the pull request incrementally with one additional > commit since the last revision: > > 8292937: Move logic into VM side src/java.base/share/native/libjava/io_util.c line 71: > 69: jint nread = IO_Read(fd, buf, len); > 70: if (nread == -1) { > 71: JNU_ThrowIOExceptionWithLastError(env, "Read error"); These methods are specified to throw the more specific I/O exception EOFException at EOF. ------------- PR: https://git.openjdk.org/jdk/pull/10031