On Sat, 16 Dec 2023 14:52:42 GMT, Markus KARG <d...@openjdk.org> wrote:

>> I've created a draft change for `OutputStream#write(ByteBuffer)`, and I have 
>> benchmarked several cases including 
>> `ByteArrayInputStream.transferTo(BufferedOutputStream(ByteArrayOutputStream))`,
>>  `ByteArrayInputStream.transferTo(DataOutputStream(FileOutputStream))`.
>> 
>> Benchmarks show there's improvement in both allocation rate and latency.
>> 
>> Read-only `ByteBuffers` can address poisoning concerns as non-jdk code can't 
>> peek into read-only arrays.
>> 
>> The `write(ByteBuffer)` approach supports cases like `CheckedOutputStream`, 
>> `DataOutputStream` which would be hard or impossible to optimize when 
>> passing naked byte arrays.
>> 
>> Here are the results: 
>> https://gist.github.com/vlsi/7f4411515a4f2dbb0925fffde92ccb1d
>> Here is the diff: 
>> https://github.com/vlsi/jdk/compare/ce108446ca1fe604ecc24bbefb0bf1c6318271c7...write_bytebuffer
>> 
>> @mkarg , @bplb , @AlanBateman , could you please review 
>> `OutputStream.write(ByteBuffer)` approach?
>
> @vlsi This is a very interesting solution 🤩, but it opens a number of 
> questions! 🤔 As a start, here are mine:
> * You propose a new public method (`OutputStream.write(ByteBuffer)`) as part 
> of your solution. We need to discuss whether this is worth the effort to 
> change all implementations (and to perceive acceptable performance, all 
> custom authors need to optimize their custom classes, too). We also need to 
> discuss whether we like the design choice that de facto the public API (not 
> just the implementation) of the legacy IO domain (`OutputStream`) is now 
> linked to the NIO domain (`ByteBuffer`) (which, IMHO, feels some kind of 
> scary beyond `ChannelOutputStream`).
> * Just thinking loudly: I wonder if we could simplify the solution, or if we 
> could turn parts of it into some generic `byte[] readOnly(byte[])` utility.
> * I would like to know how much faster the solution with `ByteBuffer` is 
> compared to `Arrays.copyOfRange()`: Is it really so huge that it is worth the 
> additional trouble?
> * I would like to know how much slower the solution with `ByteBuffer` is 
> compared to *skipping* `Arrays.copyOfRange()` for trusted cases (as you 
> removed the skipping).
> * I would like to know the performance of custom streams, because your 
> default implementation is filling a temporary byte array with a 
> Java-implemented byte-by-byte loop, which IMHO would be rather painful 
> compared to hardware-supported `copyOrRange()`, and it does that even in case 
> of *trusted* targets.
> * @briangoetz Wouldn't we rather teach the Java language some day to provide 
> native read-only arrays? That would be much faster, much better to read and 
> implies less complex code for the end user.

@mkarg , thank you for the review, I replied in JIRA to avoid mixing comments 
across different issues: 
https://bugs.openjdk.org/browse/JDK-8321271?focusedId=14634794&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14634794

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16879#discussion_r1428842060

Reply via email to