JDK-8352891 Performance improvements to ByteArrayOutputStream

Stephen Colebourne scolebourne at joda.org
Mon May 12 16:28:28 UTC 2025


I agree that ByteArrayOutputStream is a problem child, and often a
performance pain. While it probably doesn't add much to the debate, I
recently wrote my own replacement class
https://github.com/JodaOrg/joda-beans/blob/main/src/main/java/org/joda/beans/ser/LinkedByteArrayOutputStream.java
thanks
Stephen


On Mon, 12 May 2025 at 15:36, Engebretson, John <jengebr at amazon.com> wrote:
>
>   Friendly ping.  There seems to be support for this idea in some form (especially on the PR) but I haven’t received anything definitive from this email discussion.  The safest proposal on the table is from @liach: make this a JDK-internal class (for now) and modify JDK classes to rely on it.  Assuming good results, we consider making it public in future releases.
>
>   Could I please get some form of signoff from the core team?  I’d really like to deliver something here soon, otherwise I have to move on.
>
>   Thank you very much!  😊
>
>     John
>
>
>
> From: core-libs-dev <core-libs-dev-retn at openjdk.org> On Behalf Of Engebretson, John
> Sent: Tuesday, April 22, 2025 7:52 AM
>
>
>
>   Thank you Alan!  I’ll try to address each of your points, apologies if I miss anything:
>
>
>
>         Maybe the two efforts should be separated.
>
>
>
>   I’m good with that, and will operate that way unless someone argues otherwise.
>
>
>
>        The factory methods can return a different implementation, in particular BAOS.unsynchronized (or whatever name it gets) does not need to collect the bytes in a contiguous array. So having a BAOS.unsynchronized may help with some of the scenarios that you are looking at.
>
>
>
>   I think this is a clever way to go and I’m in favor… just not sold on the name.  I won’t abandon the effort if you feel otherwise.  😊  Let me know if we’re ready to proceed with this or another name.
>
>
>
>       I think the PR proposing MemoryOutputStream is a bit premature
>
>
>
>   This was intended solely to share code for discussion, and it’s been effective in that sense.  I agree that the PR is nowhere near merging.
>
>
>
>       Maybe you have explored a segment like API or a cursor or consumer API to handle the bytes?
>
>
>
>   The current version of the PR is along these lines, providing one public class whose contents are available via views (SeekableByteChannel, BAOS, ByteArrayInputStream) as well as the usual add/write/updates, long size(), and lambda-based applyToSegment(Function) and applyToIndex(Function).  The public wrapping needs to evolve but I think these provide the core of the API.
>
>     John
>
>


More information about the core-libs-dev mailing list