This PR-*draft* is **work in progress** and an invitation to discuss a possible 
solution for issue 
[JDK-8265891](https://bugs.openjdk.java.net/browse/JDK-8265891). It is *not 
yet* intended for a final review.

As proposed in JDK-8265891, this PR provides an implementation for 
`Channels.newInputStream().transferTo()` which provide superior performance 
compared to the current implementation. The changes are:
* 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 more JRE heap in the fallback case when no NIO is possible (still only 
KiBs, hence mostl ynegligible even on SBCs) to better perform on modern 
hardware / fast I/O devides.

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. So this PoC proofs that it makes sense 
to finalize this work and turn it into an actual OpenJDK contribution. 

I encourage everybody to discuss this draft:
* Are there valid arguments for *not* doing this change?
* Is there a *better* way to improve performance of 
`Channels.newInputStream().transferTo()`?
* How to go on from here: What is missing to get this ready for an actual 
review?

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

Commit messages:
 - Draft: Correctly positioning channel in case of exception
 - Draft: Corrected try-catch block
 - Draft: Moving I/O ops into the for statement block
 - Draft: Replaced custom bounds check by Objects.checkFromIndexSize()
 - Draft: Replaced casting by pattern matching for instanceof
 - Draft: Replacing var by actual type
 - Draft: Hiding ChannelOutputStream from the API
 - Draft: Removing final everywhere but kept only for constants
 - Draft: Using Thread-Local Buffer Cache
 - Draft: Increased DEFAULT_BUFFER_SIZE
 - ... and 1 more: https://git.openjdk.java.net/jdk/compare/66274320...ed49098a

Changes: https://git.openjdk.java.net/jdk/pull/4263/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4263&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8265891
  Stats: 286 lines in 4 files changed: 205 ins; 76 del; 5 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4263.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4263/head:pull/4263

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

Reply via email to