Greetings, jar team!

Recent changes by Xueming have made building rt.jar an order of
magnitude faster.
But it's still too slow for our taste.
Here's another order of magnitude...

In our tests, this reduces rt.jar build time to 2 sec (!)

diff --git a/src/share/classes/sun/tools/jar/Main.java
b/src/share/classes/sun/tools/jar/Main.java
--- a/src/share/classes/sun/tools/jar/Main.java
+++ b/src/share/classes/sun/tools/jar/Main.java
@@ -56,7 +56,7 @@
     Set<File> entries = new LinkedHashSet<File>();

     // Directories specified by "-C" operation.
-    List<String> paths = new ArrayList<String>();
+    Set<String> paths = new HashSet<String>();

     CRC32 crc32 = new CRC32();
     /*


contributed by Jeremy Manson, who writes:

"""Basically, rt.jar seems to be built by taking a huge long list of
directories:
jar -C dir class -C dir class -C dir class <repeat 16000 times>
All of these directories are *exactly the same place*.  However, the jar command
gives each a separate entry in the big list of directories.
For each class, it iterates through all 16000 identical entries to find the
right directory.  Using HashSet reduces the size of this set to 1."""

Now, this is a behavior-preserving change, but the current code that uses
paths in Main.java is extremely suspect.  I believe the better fix would be
to eviscerate the code that handles the "-C" flag and do it right,
but the change above is much lower risk, and users have been living
with the current misbehavior of "jar" for a very long time indeed.

So, reviewers, the choice is yours - optimize the buggy behavior,
or replace it with correct code, that will likely be even faster.
Also, please file a bug.

Someone who cares about the Makefiles can also try to remove the
16000 gratuitous -C flags that makes jar's life "jar hell".

Martin

Reply via email to