RFR: Faster ZipFile.getEntry()/entries()

Xueming Shen xueming.shen at oracle.com
Thu Sep 5 23:16:43 UTC 2013


The change proposed here is to bring the zip entry handing code from the 
level to the java level. This effectively solves the performance issues 
of ZipFile.getEntry
and entries() that is caused by multiple jni invocation steps to 
generate one single
ZipEntry (see ZipFile.getZipEntry()). A simple non-scientific benchmark 
test of simply
iterating the ZipFile via the Enumeration from entries() on 
rt.jar/charsets.jar suggests
a 50%+ speed boost.


Couple notes:

(1) Ideally it might be desired to go further to bring all the native 
code of ZipFile to
java level (which should help completely remove that mmap crash issue, 
have better
file and memory management... ), but it is suggested that it might be 
better to limit
the scope of the change at this late release circle.

(2) JavaFile.read0() is the version that uses 
"getPrimitiveArrayCritical" to read file bits
into the java array directly (instead of using a stack buffer and then 
copy into the
java array), which appears to be 5% faster. But I can't make up my mind 
of which one
would be better. Given (1) the trouble we had before in De/Infalter code 
(when the
getPrimitiveArrayCritical is being heavily used), (2) FileInputStream 
uses the same
"copy" approach, I'm staying with the "copy" appraoch, but option 

(3) We will have to keep the native implementation (zip_util.c) for the 
vm directly


More information about the core-libs-dev mailing list