Hi Steve,

This patch has been cooking and re-heated enough times that i think it’s as 
good as done in terms of being reviewed.

We can follow up with further issues for other aspects, such as performance if 
need be.

Paul.

> On 10 Feb 2016, at 02:04, Steve Drach <steve.dr...@oracle.com> wrote:
> 
> Hi,
> 
> Yet another webrev, http://cr.openjdk.java.net/~sdrach/8132734/webrev.06/ 
> <http://cr.openjdk.java.net/~sdrach/8132734/webrev.06/>, with a change to 
> JarEntryIterator to fix a problem discovered by performance tests — calling 
> hasNext() twice as often as needed.  I also removed the @since 9 tags from 
> the methods entries() and stream(), and added an additional sentence to the 
> spec for each of those methods that clarifies what a base entry is (actually 
> is not).
> 
>> I think having stream and entries do this is right although I would like to 
>> see some performance data if possible.
> 
> See http://cr.openjdk.java.net/~sdrach/8132734/JarFile%20Performance.pdf 
> <http://cr.openjdk.java.net/~sdrach/8132734/JarFile%20Performance.pdf>
> 
> I used JMH to run the benchmark.  See 
> http://cr.openjdk.java.net/~sdrach/8132734/MyBenchmark.java 
> <http://cr.openjdk.java.net/~sdrach/8132734/MyBenchmark.java>.  I used two 
> jar files, the rt.jar file from JDK 8 that has 20653 entries and the 
> multi-release.jar found in the test directory with 14 entries.  Obviously 
> rt.jar is not a multi-release jar file.
> 
> The first two tables (1 and 2) are comparable and the second two tables are 
> somewhat comparable (3 and 4).
> 
> Tables 1 and 2 have 4 sections that show the results of tests on the two jar 
> files in 4 configurations of JarFile.  The tests were done with a JarFile 
> object constructed without the Release object argument, essentially the 
> legacy constructor.  The section labeled "JDK 8 JarFile” was done with JDK 
> 8u66.  The section labeled “JDK 9 JarFile” was done with the latest build of 
> openjdk/jdk9/dev without any changes in my 8132734 changeset.  I chose this 
> section as the reference, so the last column shows the values normalized to 1 
> micro/milli second per operation (rt.jar times are in milliseconds and 
> multi-release.jar times are in microseconds).  It should be obvious that JDK 
> 9 is much faster than JDK 8, somewhere on the order of 5-6 times faster.  I 
> think that is because ZipFile doesn’t use JNI in JDK 9.
> 
> Of the two remaining sections in Tables 1 and 2, the section labeled 
> “MultiRelease JarFile” differs from the section labeled “MultiRelease 
> JarFile, new iterator” only in the JarEntryIterator class.  The first one 
> uses the original iterator in JarFile.java that can be seen starting with 
> line 551 of webrev.04 
> <http://cr.openjdk.java.net/~sdrach/8132734/webrev.04/>, and the new iterator 
> starts with line 553 of webrev.06 
> <http://cr.openjdk.java.net/~sdrach/8132734/webrev.06/>.  The results are 
> strange.  The new, more complex, iterator appears to be faster than the old, 
> simpler, iterator.  I double, and triple, checked it, but it was always 
> faster.  I used jitwatch to look at the hotspot logs generated during 
> compilation and neither method was compiled.  I suppose I could dig into it 
> further but decided not to.  Consider it good news.  The results do show that 
> the multi-release enhancement slows JarFile entries/stream down by 2-18% 
> depending on the size of the jar file.  But they are still much better than 
> the JDK 8 values.
> 
>> Also I would expect that if a JAR file is not mult-release but the library 
>> opens it with Release.RUNTIME to perform the same as opening the JAR file 
>> with the Release-less constructors.
> 
> The results in Table 3 attempts to answer this question since rt.jar is not a 
> multi-release jar file.  This tells me that if one opens the JarFile with 
> Release.RUNTIME, that there is a performance penalty of 2-6% on this very 
> large jar file.
> 
> Finally, the results in Table 4 tell me that processing a true multi-release 
> jar file takes about 80% more time per entries() or stream() operation.  I’ve 
> looked at this in a profiler and there is no particular area that stands out 
> to me, it’s just more complicated to process a multi-release jar file, as 
> would be expected.
> 
>> I think the javadoc will need to also need to make it clear whether entries 
>> with names starting with META-INF/versions/ are returned.
> 
> Fixed.
> 
>> 
>> I see you've added @since 9 to the existing methods, I assume you didn't 
>> mean to do this.
> 
> Fixed.
> 
>> 
>> At some point then we need to discuss how RUNTIME_VERSION is computed. Iris 
>> (via Mandy) has pushed jdk.Version to jdk9/dev but having it exported by 
>> java.base conflicts with the design principles in JEP 200. Moving it to 
>> another module means that code in java.base cannot use it and thus the JAR 
>> file can't use it.
> 
> Left as is.
> 

Reply via email to