RFR: 8265891: ChannelInputStream.transferTo() uses FileChannel.transferTo() [v2]
Markus KARG
github.com+1701815+mkarg at openjdk.java.net
Sat Aug 21 18:08:58 UTC 2021
> 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).
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. The pull request contains two new commits since the last revision:
- 8265891: ChannelInputStream.transferTo() uses FileChannel.transferTo()
As suggested in 8265891 this change implements a performance optimization
for ChannelInputStream.transferTo(): It uses FileChannel.transferTo()
in case the wrapped channel actually is a FileChannel, as in that case,
the actual work of transferring bytes can potentially get offloaded to the
operating system / file system.
As more such optimizations are likely to follow in the very same code
segment, this change is deliberately elaborate and rather complex in its
design, e. g. it already holds blocking locks for the complete time of
operation on input and output channels.
Signed-off-by: Markus Karg <markus at headcrashing.eu>
- 8265891: ChannelInputStream.transferTo() uses FileChannel.transferTo(FileChannel)
As suggested in 8265891 this change implements a performance optimization
for ChannelInputStream.transferTo(): It uses FileChannel.transferTo()
in case both wrapped channels actually are FileChannels, as in that case,
the actual work of transferring bytes can potentially get offloaded to the
operating system / file system.
Signed-off-by: Markus Karg <markus at headcrashing.eu>
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/5179/files
- new: https://git.openjdk.java.net/jdk/pull/5179/files/84a7b06c..f03ca97d
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=5179&range=01
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=5179&range=00-01
Stats: 46 lines in 2 files changed: 24 ins; 12 del; 10 mod
Patch: https://git.openjdk.java.net/jdk/pull/5179.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/5179/head:pull/5179
PR: https://git.openjdk.java.net/jdk/pull/5179
More information about the nio-dev
mailing list