On Thu, 14 Apr 2022 01:40:50 GMT, Brian Burkhalter <b...@openjdk.org> wrote:

> Modify native multi-byte read-write code used by the `java.io` classes to 
> limit the size of the allocated native buffer thereby decreasing off-heap 
> memory footprint and increasing throughput.

Currently for `java.io.FileInputStream.read(byte[],int,int)` and 
`java.io.FileOutputStream.write(byte[],int,int)`, for example, if the number of 
bytes respectively to be read or written exceeds 8192, an array of the total 
length of the read or write is allocated. For large reads or writes this could 
be significant. It is proposed to limit the maximum allocation size to 1 MB and 
perform the read or write by looping with this buffer. For reading or writing 
less than 1 MB, there is no effective change in the implementation.

This change both saves off-heap memory and increases throughput. An allocation 
of 1  MB is only 0.42% the size of the buffer in the JBS issue, 501 x 501 x 501 
x 2 (= 251,503,002), so for this case the memory reduction is drastic. Reading 
throughput is almost doubled and writing throughput improved by about 50%. As 
measured on macOS, the throughput of the methods mentioned above before the 
change was:


Benchmark         Mode  Cnt   Score   Error  Units
ReadWrite.read   thrpt    5  10.108 ± 0.264  ops/s
ReadWrite.write  thrpt    5   7.188 ± 0.431  ops/s

and that after is:

Benchmark         Mode  Cnt   Score   Error  Units
ReadWrite.read   thrpt    5  20.112 ± 0.262  ops/s
ReadWrite.write  thrpt    5  10.644 ± 4.568  ops/s

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

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

Reply via email to