RFR: 8264777: Overload optimized FileInputStream::readAllBytes

Brian Burkhalter bpb at openjdk.java.net
Tue May 4 17:48:51 UTC 2021


On Tue, 4 May 2021 14:07:18 GMT, Alan Bateman <alanb at openjdk.org> wrote:

>> Please consider this request to override the `java.io.InputStream` methods `readAllBytes()` and `readNBytes(int)` in `FileInputStream` with more performant implementations. The method overrides attempt to read all requested bytes into a single array of the required size rather than composing the result from a sequence of smaller arrays. An example of the performance improvements is as follows.
>> 
>> **readAllBytes**
>> Before
>> 
>> Benchmark                                    (length)   Mode  Cnt      Score     Error  Units
>> ReadAllBytes.readAllBytesFileInputStream      1000000  thrpt   20   2412.031 ±   7.309  ops/s
>> ReadAllBytes.readAllBytesFileInputStream     10000000  thrpt   20    212.181 ±   0.369  ops/s
>> ReadAllBytes.readAllBytesFileInputStream    100000000  thrpt   20     19.860 ±   0.048  ops/s
>> ReadAllBytes.readAllBytesFileInputStream   1000000000  thrpt   20      1.298 ±   0.183  ops/s
>> 
>> After
>> 
>> Benchmark                                    (length)   Mode  Cnt      Score     Error  Units
>> ReadAllBytes.readAllBytesFileInputStream      1000000  thrpt   20   8218.473 ±  43.425  ops/s
>> ReadAllBytes.readAllBytesFileInputStream     10000000  thrpt   20    302.781 ±   1.273  ops/s
>> ReadAllBytes.readAllBytesFileInputStream    100000000  thrpt   20     22.461 ±   0.084  ops/s
>> ReadAllBytes.readAllBytesFileInputStream   1000000000  thrpt   20      1.502 ±   0.003  ops/s
>> 
>> 
>> **readNBytes**
>> 
>> `N = file_size / 2`
>> 
>> Before
>> 
>> Benchmark                                    (length)   Mode  Cnt      Score     Error  Units
>> ReadAllBytes.readHalfBytesFileInputStream     1000000  thrpt   20   5585.500 ± 153.353  ops/s
>> ReadAllBytes.readHalfBytesFileInputStream    10000000  thrpt   20    436.164 ±   1.104  ops/s
>> ReadAllBytes.readHalfBytesFileInputStream   100000000  thrpt   20     40.167 ±   0.141  ops/s
>> ReadAllBytes.readHalfBytesFileInputStream  1000000000  thrpt   20      3.291 ±   0.211  ops/s
>> 
>> 
>> After
>> 
>> Benchmark                                    (length)   Mode  Cnt      Score     Error  Units
>> ReadAllBytes.readHalfBytesFileInputStream     1000000  thrpt   20  15463.210 ±  66.045  ops/s
>> ReadAllBytes.readHalfBytesFileInputStream    10000000  thrpt   20    561.752 ±   0.951  ops/s
>> ReadAllBytes.readHalfBytesFileInputStream   100000000  thrpt   20     45.043 ±   0.102  ops/s
>> ReadAllBytes.readHalfBytesFileInputStream  1000000000  thrpt   20      4.629 ±   0.035  ops/s
>
> src/java.base/share/classes/java/io/FileInputStream.java line 342:
> 
>> 340: 
>> 341:     private native long length() throws IOException;
>> 342:     private native long position() throws IOException;
> 
> Can you confirm that you've tested with special files? It's very likely that there will be cases where lseek will fail.

Only regular files this far. Are there any particular special files which would be of interest?

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

PR: https://git.openjdk.java.net/jdk/pull/3845


More information about the core-libs-dev mailing list