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

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

Commit messages:
 - 8292937: Fix copyright
 - 8292937: Improve performance of some read operations of RandomAccessFile

Changes: https://git.openjdk.org/jdk/pull/10031/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10031&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8292937
  Stats: 129 lines in 3 files changed: 96 ins; 22 del; 11 mod
  Patch: https://git.openjdk.org/jdk/pull/10031.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10031/head:pull/10031

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

Reply via email to