RFR: JDK-8299336 - InputStream::DEFAULT_BUFFER_SIZE should be 16384
Markus KARG
duke at openjdk.org
Tue Dec 27 16:37:48 UTC 2022
On Tue, 27 Dec 2022 14:55:31 GMT, Peter Levart <plevart at openjdk.org> wrote:
> Hello Markus! Could you show the JMH code that produced the benchmark results?
The following lines make use of a custom method I have added to `InputStream` in a custom build of JDK 21, so JMH can control the size of the buffer. The test runs approx. 42 Minutes, and the result depends on the actual hardware you are using. The common sense of all tested hardware so far is that going from 8K to 16K you have a *strong* gain, but the *additional* gain is lower with duplicating buffer size further. You have *double* performance with the specific cloud VM I was using, while you only have approx. only *20%* gain on my personal laptop with local SSD. Anyways, you always have a *considerable* gain.
public class TransferToPerformance {
public static void main(final String[] args) throws IOException {
Main.main(args);
}
@State(Scope.Benchmark)
public static class Config {
@Param({ "1048576" })
public int streamSize;
@Param({ "8192", "16384", "32768", "65536", "131072" })
public int bufferSize;
public InputStream source;
public OutputStream target;
private Path path;
@Setup(Level.Invocation)
public void setUp() throws IOException {
InputStream.setBufferSize(bufferSize); // static utility method using custom build of JDK 21
path = Files.createTempFile("a-", ".bin");
var bytes = createRandomBytes(streamSize);
Files.deleteIfExists(this.path);
Files.write(this.path, bytes, CREATE, TRUNCATE_EXISTING, WRITE);
source = new FileInputStream(this.path.toFile());
target = new ByteArrayOutputStream();
}
@TearDown(Level.Invocation)
public void tearDown() throws IOException {
source.close();
target.close();
source = null;
target = null;
Files.deleteIfExists(this.path);
}
}
private static final Random RND = new Random();
private static byte[] createRandomBytes(int size) {
var bytes = new byte[size];
RND.nextBytes(bytes);
return bytes;
}
@Benchmark
public final void transferTo(Config config, Blackhole blackhole) throws IOException {
blackhole.consume(config.source.transferTo(config.target));
config.target.flush();
config.target.close();
}
}
-------------
PR: https://git.openjdk.org/jdk/pull/11783
More information about the core-libs-dev
mailing list