Integrated: 8341594: Use Unsafe to coalesce reads in java.util.zip.ZipUtils

Claes Redestad redestad at openjdk.org
Tue Oct 8 08:18:04 UTC 2024


On Sun, 6 Oct 2024 14:16:44 GMT, Claes Redestad <redestad at openjdk.org> wrote:

> #14632 showed that coalescing loads in the `ZipUtils` utility methods could improve performance in zip-related microbenchmarks, but the suggested PR would increase startup overheads by early use of `ByteArrayLittleEndian` which depends on `VarHandles`. Progress was stalled as we backed out some related early use of `ByteArray(LittleEndian)` and started exploring merge store optimizations in C2. 
> 
> In this PR I instead suggest using `Unsafe` directly to coalesce `short`, `int`, and `long` reads from zip data. Even with explicit bounds checking to ensure these utilities are _always_ safe there are significant improvements both to lookup speed and speed of opening zip files (most if not all bounds checks are optimized away):
> 
> 
> make test TEST=micro:java.util.zip.ZipFile
> 
> Name                          (size) Cnt       Base      Error        Test      Error  Unit  Change
> GetEntry.getEntryHit             512  15     37.999 ±    0.841      34.641 ±    0.389 ns/op   1.10x (p = 0.000*)
> GetEntry.getEntryHit            1024  15     39.557 ±    0.523      36.959 ±    1.488 ns/op   1.07x (p = 0.000*)
> GetEntry.getEntryHitUncached     512  15     69.250 ±    0.931      64.851 ±    0.987 ns/op   1.07x (p = 0.000*)
> GetEntry.getEntryHitUncached    1024  15     71.628 ±    0.307      67.927 ±    0.714 ns/op   1.05x (p = 0.000*)
> GetEntry.getEntryMiss            512  15     22.961 ±    0.336      22.825 ±    0.188 ns/op   1.01x (p = 0.158 )
> GetEntry.getEntryMiss           1024  15     22.940 ±    0.115      23.502 ±    0.273 ns/op   0.98x (p = 0.000*)
> GetEntry.getEntryMissUncached    512  15     35.886 ±    0.429      35.598 ±    1.296 ns/op   1.01x (p = 0.395 )
> GetEntry.getEntryMissUncached   1024  15     38.168 ±    0.911      36.141 ±    0.356 ns/op   1.06x (p = 0.000*)
> Open.openCloseZipFile            512  15  62425.563 ±  997.455   56263.401 ±  896.892 ns/op   1.11x (p = 0.000*)
> Open.openCloseZipFile           1024  15 117491.250 ±  962.928  108055.491 ± 1595.577 ns/op   1.09x (p = 0.000*)
> Open.openCloseZipFilex2          512  15  62974.575 ±  911.095   57996.388 ±  910.929 ns/op   1.09x (p = 0.000*)
> Open.openCloseZipFilex2         1024  15 119164.769 ± 1756.065  108803.468 ±  929.483 ns/op   1.10x (p = 0.000*)
>   * = significant
> 
> 
> This PR also address some code duplication in `ZipUtils`.
> 
> An appealing alternative would be to implement a merge load analogue to the merge store optimizations in C2. Such optimizations would be very welcome since it would improve similar code ou...

This pull request has now been integrated.

Changeset: ffb60e55
Author:    Claes Redestad <redestad at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/ffb60e55cd77a92d19e1fde305f5d204b9fae429
Stats:     119 lines in 5 files changed: 18 ins; 22 del; 79 mod

8341594: Use Unsafe to coalesce reads in java.util.zip.ZipUtils

Reviewed-by: lancea

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

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


More information about the core-libs-dev mailing list