RFR: 8276779: (ch) InputStream returned by Channels.newInputStream should have fast path for SelectableChannels [v14]

Alan Bateman alanb at openjdk.java.net
Sun Nov 21 08:36:07 UTC 2021


On Sat, 20 Nov 2021 18:59:50 GMT, Markus KARG <duke at openjdk.java.net> wrote:

>> As proposed in JDK-8265891, this PR provides an implementation for `Channels.newInputStream().transferTo()` which provide superior performance compared to the current implementation. This PR is a spin-off from https://github.com/openjdk/jdk/pull/4263 and deliberately concentrates **only** on `FileChannel`s. Other types of channels will be discussed in future PRs.
>> 
>> * Prevents transfers through the JVM heap as much as possibly by offloading to deeper levels via NIO, hence allowing the operating system to optimize the transfer.
>> 
>> Using JMH I have benchmarked both, the original implementation and this implementation, and (depending on the used hardware and use case) performance change was approx. doubled performance. A rather similar approach in different use casse was recently implemented by https://github.com/openjdk/jdk/pull/5097 which was reported by even provide 5x performance (https://github.com/openjdk/jdk/pull/5097#issuecomment-897271997).
>> 
>> **Update:** This sub-issue *only* defines the work to be done to implement JDK-8265891 *solely* for the particular case of FileChannel.transferTo(WriteableByteChannel), including special treatment of SelectableByteChannel, as the `master` branch already contains code to handle the specific case of FileChannel.transferTo(FileChannel).
>
> Markus KARG has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR.

test/jdk/java/nio/channels/Channels/TransferTo.java line 198:

> 196: 
> 197:         // IllegalBlockingMode must be thrown when trying to perform a transfer
> 198:         assertThrows(IllegalBlockingModeException.class, () -> is2.transferTo(os2));

Thanks for adding this test. It looks like it leaks 5 file descriptors (the FileChannel, and the source/sink of two pipes). Can you update these to close the channels? The test current runs in othervm mode but if it is changed back to agentvm mode then leaving channels open could impact tests that are run later in the same VM.

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

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


More information about the nio-dev mailing list