jdk icon indicating copy to clipboard operation
jdk copied to clipboard

8342040: Further improve entry lookup performance for multi-release JARs

Open eirbjo opened this issue 4 months ago • 12 comments

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 an approximation of the number of versions found for the entry being looked up, which will 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.

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.


Progress

  • [x] Change must be properly reviewed (1 review required, with at least 1 Reviewer)
  • [x] Change must not contain extraneous whitespace
  • [x] Commit message must refer to an issue

Issue

  • JDK-8342040: Further improve entry lookup performance for multi-release JARs (Enhancement - P4)

Reviewers

Contributors

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/21489/head:pull/21489
$ git checkout pull/21489

Update a local copy of the PR:
$ git checkout pull/21489
$ git pull https://git.openjdk.org/jdk.git pull/21489/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 21489

View PR using the GUI difftool:
$ git pr show -t 21489

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/21489.diff

Webrev

Link to Webrev Comment

eirbjo avatar Oct 14 '24 11:10 eirbjo