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.

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

Commit messages:
 - Update field comment for metaVersions
 - Update copyright year
 - Only check versions for the particular entry being looked up

Changes: https://git.openjdk.org/jdk/pull/21489/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21489&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8342040
  Stats: 54 lines in 4 files changed: 31 ins; 0 del; 23 mod
  Patch: https://git.openjdk.org/jdk/pull/21489.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21489/head:pull/21489

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

Reply via email to