> When decoding an uninterlaced 8-bit PNG image, the PNGImageDecoder is 
> basically copying one byte at a time.
> 
> This PR uses System.arraycopy instead, and it shows approx a 10% improvement.
> 
> This graph shows the time it takes different decoders to convert a byte array 
> into a BufferedImage as the size of the PNG image increases:
> 
> <img width="596" height="366" alt="Screenshot 2025-12-27 at 9 14 19 PM" 
> src="https://github.com/user-attachments/assets/73583cb2-eda0-47a8-b818-735a1835f1e8";
>  />
> 
> (This originally came to my attention when looking at an image in Java 1.8. 
> There the ImageConsumer model took approx 400% longer than ImageIO. I was 
> happy to see in recent JDKs that gap narrowed significantly, but there was 
> still a noticeable 10% discrepancy.)
> 
> I haven't tried submitting a performance enhancement PR before; I'm not sure 
> if this issue meets this group's threshold for being worth addressing. And if 
> it does: I'm not sure how to structure a unit test for it.

Jeremy Wood has updated the pull request incrementally with one additional 
commit since the last revision:

  8374377: Adding a JMH test for PNGImageDecoder
  
  This corroborates previous (more informal) tests that show approx a 10% 
improvement.
  
  Without this PR I observed this result on my Mac 26.2 laptop:
  
  ```
  Benchmark                                                 Mode  Cnt   Score   
Error  Units
  PNGImageDecoder_8bit_uninterlaced.measurePNGImageDecoder  avgt   15  25.296 ± 
0.521  ms/op
  ```
  
  With this PR I observed this result:
  
  ```
  Benchmark                                                 Mode  Cnt   Score   
Error  Units
  PNGImageDecoder_8bit_uninterlaced.measurePNGImageDecoder  avgt   15  22.132 ± 
0.378  ms/op
  ```

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/29004/files
  - new: https://git.openjdk.org/jdk/pull/29004/files/d58d3609..c91a1f44

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=29004&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=29004&range=00-01

  Stats: 188 lines in 1 file changed: 188 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/29004.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/29004/head:pull/29004

PR: https://git.openjdk.org/jdk/pull/29004

Reply via email to