On Tue, 4 May 2021 20:18:25 GMT, Brian Burkhalter <[email protected]> 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
>
> Brian Burkhalter has updated the pull request incrementally with one
> additional commit since the last revision:
>
> 8264777: Handle cases where length() returns zero
src/java.base/share/classes/java/io/FileInputStream.java line 284:
> 282: long size = length - position;
> 283: if (size > (long)Integer.MAX_VALUE)
> 284: throw new OutOfMemoryError("Required array size too
> large");
What do you think of adding "length, position, and size" to the exception
message?
-------------
PR: https://git.openjdk.java.net/jdk/pull/3845