On Mon, 14 Oct 2024 11:01:21 GMT, Eirik Bjørsnøs <eir...@openjdk.org> wrote:

> Please review this PR which speeds up `JarFile::getEntry` lookup 
> significantly for multi-release JAR files.
> 
> The changes in this PR are motivated by the following insights:
> 
> * `META-INF/versions/` is sparsely populated.
> * Most entries are not versioned
> * The number of unique versions for each versioned entry is small
> * Many JAR files are 'accidentally' multi-release; they use the feature to 
> hide `module-info.class` from Java 8.
> 
> Instead of  performing one lookup for every version identified in the JAR, 
> this PR narrows the version search down to only the number of versions found 
> for the entry being looked up, which will most often be zero. This speeds up 
> lookup for non-versioned entries, and provides a more targeted search for 
> versioned entries.
> 
> An alternative approach could be to normalize the hash code to use the 
> none-versioned name such that versioned and non-versioned names would be 
> resolved in the same lookup. This was quickly abandoned since the code 
> changes were intrusive and mixed too many JAR specific concerns into 
> `ZipFile`.
> 
> Testing: The existing `JarFileGetEntry` benchmark is updated to optionally 
> test a multi-release JAR file with one versioned entry for 
> `module-info.class` plus two other versioned class files for two distinct 
> versions. Performance results in [first comment](#issuecomment-2410901754).
> 
> Running `ZipFileOpen` on a multi-release JAR did not show a significat 
> difference between this PR and mainline. 
> 
> The JAR and ZIP tests are run locally. GHA results green. The `noreg-perf` 
> label is added in JBS.

Performance results:

Baseline:


JarFileGetEntry.getEntryHit           false    1024  avgt   15   64.619 ? 6.633 
 ns/op
JarFileGetEntry.getEntryHit            true    1024  avgt   15  301.770 ? 4.819 
 ns/op
JarFileGetEntry.getEntryHitUncached   false    1024  avgt   15   82.030 ? 2.057 
 ns/op
JarFileGetEntry.getEntryHitUncached    true    1024  avgt   15  327.966 ? 3.092 
 ns/op
JarFileGetEntry.getEntryMiss          false    1024  avgt   15   27.937 ? 0.982 
 ns/op
JarFileGetEntry.getEntryMiss           true    1024  avgt   15  267.280 ? 2.196 
 ns/op
JarFileGetEntry.getEntryMissUncached  false    1024  avgt   15   53.214 ? 1.085 
 ns/op
JarFileGetEntry.getEntryMissUncached   true    1024  avgt   15  290.904 ? 2.359 
 ns/op


PR:


Benchmark                              (mr)  (size)  Mode  Cnt   Score   Error  
Units
JarFileGetEntry.getEntryHit           false    1024  avgt   15  63.311 ? 3.014  
ns/op
JarFileGetEntry.getEntryHit            true    1024  avgt   15  71.333 ? 1.510  
ns/op
JarFileGetEntry.getEntryHitUncached   false    1024  avgt   15  80.401 ? 0.516  
ns/op
JarFileGetEntry.getEntryHitUncached    true    1024  avgt   15  94.810 ? 1.136  
ns/op
JarFileGetEntry.getEntryMiss          false    1024  avgt   15  26.717 ? 0.276  
ns/op
JarFileGetEntry.getEntryMiss           true    1024  avgt   15  45.677 ? 0.412  
ns/op
JarFileGetEntry.getEntryMissUncached  false    1024  avgt   15  53.122 ? 0.954  
ns/op
JarFileGetEntry.getEntryMissUncached   true    1024  avgt   15  66.583 ? 0.425  
ns/op

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

PR Comment: https://git.openjdk.org/jdk/pull/21489#issuecomment-2410901754

Reply via email to