PNG image writing: memory inefficiency?

Phil Race philip.race at oracle.com
Thu Aug 1 17:57:50 UTC 2024


https://bugs.openjdk.org/browse/JDK-8337681

-phil.

On 8/1/2024 10:08, Daniel Gredler wrote:
> Thanks for the confirmation!
>
> I went ahead and made some measurements, and the improvement 
> possibilities really are quite good -- in a local test 
> PNGImageWriter.write( ) and callees were initially showing up as an 
> allocation hotspot (~400k objects / ~65 MB allocated), but after some 
> optimizations I'm seeing much better numbers (~400 objects / ~740 KB 
> allocated).
>
> I also spent some time creating regression tests for different 
> combinations of alpha pre-multiplied vs. not, BufferedImage vs. other 
> image types, untiled vs. single-tile vs. multi-tile, custom source 
> bands vs. none, etc.
>
> I've filed a bug (internal review ID 9077379), but do not have a bug 
> number yet. Once I have a bug number I'll submit a PR for review.
>
> Take care,
>
> Daniel
>
>
> On Wed, Jul 31, 2024 at 8:13 PM Philip Race <philip.race at oracle.com> 
> wrote:
>
>     I think yes.
>     Whereas JPG grabs the raster for the whole image whereas as you
>     noted,
>     PNG is looping row by row,
>     so there might need to be some updates in the handling of the child
>     raster needed.
>
>     -phil.
>
>
>     On 7/31/24 10:02 AM, Daniel Gredler wrote:
>     > Hi all,
>     >
>     > I'd like a quick sanity check on a possible memory inefficiency in
>     > PNGImageWriter.
>     >
>     > Some of the other image writers, like JPEGImageWriter, do their
>     best
>     > to avoid duplicating the image raster + data buffer [1]...
>     although it
>     > doesn't look like this was always the case [2].
>     >
>     > The PNGImageWriter, on the other hand, always makes a new raster +
>     > data buffer copy for each row [3]. It *is* per-row, so the data
>     isn't
>     > all duplicated in one go, but even on a row-by-row basis, it
>     ends up
>     > being quite a bit of unnecessary allocation and subsequent garbage
>     > collection.
>     >
>     > Can somebody confirm if I'm reading things right, and whether
>     > PNGImageWriter would benefit from a similar BufferedImage + single
>     > tile check, such as already exists in JPEGImageWriter?
>     >
>     > Thanks!
>     >
>     > Daniel
>     >
>     > [1]
>     >
>     https://github.com/openjdk/jdk/blob/e4c7850c177899a5da6f5050cb0647a6e1a75d31/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java#L415
>     > [2] https://bugs.openjdk.org/browse/JDK-6266748
>     > [3]
>     >
>     https://github.com/openjdk/jdk/blob/e4c7850c177899a5da6f5050cb0647a6e1a75d31/src/java.desktop/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java#L923
>     >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/client-libs-dev/attachments/20240801/877cbdf4/attachment-0001.htm>


More information about the client-libs-dev mailing list