RFR: JDK-8150496,(zipfs) Fix performance issues in zip-fs

Aleksey Shipilev aleksey.shipilev at oracle.com
Tue May 3 12:39:00 UTC 2016


Hi Sherman,

On 05/03/2016 02:28 AM, Xueming Shen wrote:
> Please help review the performance cleanup for zipfs
> 
> issue: https://bugs.openjdk.java.net/browse/JDK-8150496
> webrev: http://cr.openjdk.java.net/~sherman/8150496/webrev

ZipFileSystem.java:

*) These should be removed?

 2032             //writeShort(os, name.length);
 2033             writeShort(os, nlen);

 2220             //writeShort(os, name.length);
 2221             writeShort(os, nlen);

 2591         //inodes.forEach( (k,v) -> { System.out.printf(" %s  ->
%s%n", new String(k.name), new String(v.name)); });

 1080             /*
 1081             byte[] name = Arrays.copyOfRange(cen, pos + CENHDR,
pos + CENHDR + nlen);
 1082             */

*) There is ever-so-subtle difference in doing either:

 171             byte[] tmp = new byte[path.length + 1];
 172             System.arraycopy(path, 0, tmp, 1, path.length);
 173             tmp[0] = '/';

...or:

1083             byte[] name = new byte[nlen + 1];
1084             name[0] = '/';
1085             System.arraycopy(cen, pos + CENHDR, name, 1, nlen);

Excess op between allocation and arraycopy breaks zeroing elimination,
see e.g.:
  http://cr.openjdk.java.net/~shade/scratch/ZeroingFirstBench.java


*) Missing braces:

1483                 if (e2 == null)
1484                     throw new ZipException("invalid loc for entry
<" + e.name + ">");

*) Probably deserves a comment why these are commented out? Are these
implied to be zeroes?

1713         // int  disknum;
1714         // int  sdisknum;


> Here are the result of the sample benchmark that measures the improvement.
> http://cr.openjdk.java.net/~sherman/8150496/MyBenchmark.java

This benchmark is not very reliable:

 *) Sink everything in Blackhole. I.e. instead of, say:

    @Benchmark
    public void ZFS_Open() throws IOException {
        cnt = 0;
        for (int i = 0; i < 100; i++) {
            try (FileSystem fs = newFileSystem(path)) {
                if (Files.exists(fs.getPath(entriesS.get(0))))
		    cnt++;
            }
        }
    }

do:

    @Benchmark
    public void ZFS_Open(Blackhole bh) throws IOException {
        for (int i = 0; i < 100; i++) {
            try (FileSystem fs = newFileSystem(path)) {
                bh.consume(fs.getPath(entriesS.get(0)));
            }
        }
    }

This applies to all other methods.

Thanks,
-Aleksey




More information about the core-libs-dev mailing list