# HG changeset patch # User redestad # Date 1538474026 -7200 # Node ID 013359fdfeb23fc0a2f15125738cb73f7d02b8c2 # Parent 7cf3051d85728f54d02a17d9df0addfca5af799e Reorganize micro sources diff -r 7cf3051d8572 -r 013359fdfeb2 make/BuildMicrobenchmark.gmk --- a/make/BuildMicrobenchmark.gmk Fri Sep 28 15:32:29 2018 +0200 +++ b/make/BuildMicrobenchmark.gmk Tue Oct 02 11:53:46 2018 +0200 @@ -38,7 +38,7 @@ #### Variables -MICROBENCHMARK_SRC := $(TOPDIR)/test/micro/src/classes +MICROBENCHMARK_SRC := $(TOPDIR)/test/micro MICROBENCHMARK_JAR := $(IMAGES_OUTPUTDIR)/test/micro/microbenchmarks.jar MICROBENCHMARK_OUTPUT := $(SUPPORT_OUTPUTDIR)/test/micro diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/hotspot/gc/g1/WriteBarrier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/hotspot/gc/g1/WriteBarrier.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.hotspot.gc.g1; + +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryPoolMXBean; +import java.util.HashMap; +import java.util.List; +import java.util.LinkedList; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.OperationsPerInvocation; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * Several different tests cases of reference writes that might require write + * barrier depending on the GC used. Multiple sub-classes available with + * specific command line options set to test G1, Parallel GC and CMS. + * + * @author staffan.friberg@oracle.com (sfriberg) + */ +@State(Scope.Benchmark) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(jvmArgsAppend = {"-XX:+UseG1GC", "-Xmx256m", "-Xms256m", "-Xmn64m"}, value = 5) +public class WriteBarrier { + + // Datastructures that enables writes between different parts and regions on the heap + private Object oldReferee_region1; + private Object oldReferee_region2; + private Object youngReferee_region3; + private Object youngReferee_region4; + private Object nullReferee = null; + + private static final int OLD_REFERENCES_LENGTH = 131072; + private final Holder[] oldReferences = new Holder[OLD_REFERENCES_LENGTH]; + private Holder oldReference_region1; + private Holder youngReference_region3; + + // Keep alive to avoid them being garbage collected but not used in benchmarks + private final LinkedList padding = new LinkedList<>(); + private final LinkedList liveData = new LinkedList<>(); + private final HashMap gcCount = new HashMap<>(); + + /** + * Setup method for the benchmarks + * + * Allocate objects in a certain order to make sure the end up on the heap + * in the right way to later use them in tests. + */ + @Setup + public void setup() { + // Allocate together and System.gc to move them to Old Space and + // keep in the same region by doing a fast promotion + oldReferee_region1 = new Object(); + oldReference_region1 = new Holder(oldReferee_region1); + System.gc(); + + // Fill up old space to 80% + List pools = ManagementFactory.getMemoryPoolMXBeans(); + for (MemoryPoolMXBean pool : pools) { + if (pool.getName().contains("Old Gen")) { + pool.setUsageThreshold((pool.getUsage().getMax() / 5) * 4); + + while (!pool.isUsageThresholdExceeded()) { + // Allocate new referee and and then increase live data count + // and force promotion until heap is full enough. The last + // oldReferee will most likely be located in a different region + // compared to the the initially allocated objects. + oldReferee_region2 = new Object(); + for (int i = 0; i < 10000; i++) { + liveData.add(new Holder(new byte[512], new Object())); + } + } + break; + } + } + int index = 0; + for (Holder holder : liveData) { + if (index < oldReferences.length) { + oldReferences[index++] = holder; + } + } + + // Allocate reference and referee together to keep them in same region + // Allocate Object first so they are located in the same memory order + // as objects in old space + youngReferee_region3 = new Object(); + youngReference_region3 = new Holder(youngReferee_region3); + + // Allocate padding and a new referee to make sure the reference and + // referee are in different regions + for (int i = 0; i < 2000; i++) { + Holder tempHolder = new Holder(new byte[500], new Object()); + padding.add(tempHolder); + youngReferee_region4 = tempHolder.getReference(); + } + + /* + * Get GC numbers after all allocation but before any benchmark execution + * starts to verify that no GCs happen during the benchmarking it self as + * object will then move. + */ + List gcBeans = ManagementFactory.getGarbageCollectorMXBeans(); + for (GarbageCollectorMXBean gcBean : gcBeans) { + gcCount.put(gcBean.getName(), gcBean.getCollectionCount()); + } + } + + /** + * Invalidate any benchmark result if a GC occurs during execution of + * benchmark as moving objects will destroy the assumptions of the tests + */ + @TearDown(Level.Iteration) + public void checkGCCount() { + List gcBeans = ManagementFactory.getGarbageCollectorMXBeans(); + for (GarbageCollectorMXBean gcBean : gcBeans) { + if (gcBean.getCollectionCount() != gcCount.get(gcBean.getName())) { + throw new RuntimeException("A GC has happened during iteration and the microbenchmark result is invalid."); + } + } + } + + /** + * Write a reference in an object located in the old space and where the + * written pointer is to a old object in the same region + */ + @Benchmark + public void oldPointingToOldInSameRegion() { + oldReference_region1.setReference(oldReferee_region1); + } + + /** + * Write a reference in an object located in the old space and where the + * written pointer is to a old object in a different region + */ + @Benchmark + public void oldPointingToOldInDifferentRegion() { + oldReference_region1.setReference(oldReferee_region2); + } + + /** + * Write a reference in an object located in the old space and where the + * written pointer is to an object in the young space + */ + @Benchmark + public void oldPointingToYoungInDifferentRegion() { + oldReference_region1.setReference(youngReferee_region3); + } + + /** + * Write a reference in an object located in the young space and where the + * written pointer is to an object in the old space + */ + @Benchmark + public void youngPointingToOldInDifferentRegion() { + youngReference_region3.setReference(oldReferee_region2); + } + + /** + * Write a reference in an object located in the young space and where the + * written pointer is to a young object in the same region + */ + @Benchmark + public void youngPointingToYoungInSameRegion() { + youngReference_region3.setReference(youngReferee_region3); + } + + /** + * Write a reference in an object located in the young space and where the + * written pointer is to a young object in a different region + */ + @Benchmark + public void youngPointingToYoungInDifferentRegion() { + youngReference_region3.setReference(youngReferee_region4); + } + + /** + * Write by compiler provable null to an object located in old space + */ + @Benchmark + public void oldPointingToExplicitNull() { + oldReference_region1.setReference(null); + } + + /** + * Write by compiler unprovable null to an object located in old space + */ + @Benchmark + public void oldPointingToImplicitNull() { + oldReference_region1.setReference(nullReferee); + } + + /** + * Write by compiler provable null to an object located in young space + */ + @Benchmark + public void youngPointingToExplicitNull() { + youngReference_region3.setReference(null); + } + + /** + * Write by compiler unprovable null to an object located in young space + */ + @Benchmark + public void youngPointingToImplicitNull() { + youngReference_region3.setReference(nullReferee); + } + + /** + * Iterate and update over many old references to point to a young object. + * Since they are in different regions we will need to check the card, and + * since we will update many different reference in different memory + * locations/cards the card will need to be queued as no filtering will + * catch it. + */ + @Benchmark + @OperationsPerInvocation(value = OLD_REFERENCES_LENGTH) + public void manyOldPointingToYoung() { + for (Holder oldReference : oldReferences) { + oldReference.setReference(youngReferee_region3); + } + } + + /** + * Iterate and update over many old references to point to explicit null. + */ + @Benchmark + @OperationsPerInvocation(value = OLD_REFERENCES_LENGTH) + public void manyOldPointingToExplicitNull() { + for (Holder oldReference : oldReferences) { + oldReference.setReference(null); + } + } + + /** + * Iterate and update over many old references to point to implicit null. + */ + @Benchmark + @OperationsPerInvocation(value = OLD_REFERENCES_LENGTH) + public void manyOldPointingToImplicitNull() { + for (Holder oldReference : oldReferences) { + oldReference.setReference(nullReferee); + } + } + + /* + * Holder object for reference and padding + */ + static class Holder { + + private Object reference; + private final byte[] padding; + + public Holder(Object reference) { + this(null, reference); + } + + public Holder(byte[] padding, Object reference) { + this.padding = padding; + this.reference = reference; + } + + public void setReference(Object reference) { + this.reference = reference; + } + + public Object getReference() { + return this.reference; + } + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/lang/reflect/GetMethods.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/lang/reflect/GetMethods.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.lang.reflect; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Warmup; + +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(jvmArgsAppend = {"-Xms1g", "-Xmx1g", "-Xmn768m", "-XX:+UseParallelGC"}, value = 5) +public class GetMethods { + + public static class InternalClass { + + public InternalClass() { + } + + @Override + public String toString() { + return InternalClass.class.getName(); + } + } + + /** + * Get the constructor through reflection on a class in the same classloader + * + * @return the constructor + * @throws NoSuchMethodException + */ + @Benchmark + public Constructor getConstructor() throws NoSuchMethodException { + return InternalClass.class.getConstructor(); + } + + /** + * Get the constructor through reflection on a class in a different classloader + * + * @return the constructor + * @throws NoSuchMethodException + */ + @Benchmark + public Constructor getConstructorDifferentClassLoader() throws NoSuchMethodException { + return String.class.getConstructor(); + } + + /** + * Get the toString method through reflection on a class in the same classloader + * + * @return the toString method + * @throws java.lang.NoSuchMethodException + */ + @Benchmark + public Method getMethod() throws NoSuchMethodException { + return InternalClass.class.getMethod("toString"); + } + + /** + * Get the toString method through reflection on a class in a different classloader + * + * @return the toString method + * @throws NoSuchMethodException + */ + @Benchmark + public Method getMethodDifferentClassLoader() throws NoSuchMethodException { + return String.class.getMethod("toString"); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/lang/reflect/GetMethodsWithSecurityManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/lang/reflect/GetMethodsWithSecurityManager.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.lang.reflect; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.Permission; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.micro.util.SecurityManagerHelper; + +/** + * Test performance of Reflection with a Security Manager enabled + */ +@State(Scope.Benchmark) +public class GetMethodsWithSecurityManager extends GetMethods { + + /** + * Extract and load the security.policy + * + * @throws IOException + * @throws NoSuchAlgorithmException + */ + @Setup + public void setup() throws IOException, NoSuchAlgorithmException { + SecurityManagerHelper.setupSecurityManager(new Permission[0]); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/ArraysSort.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/ArraysSort.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util; + +import java.util.Arrays; +import java.util.Random; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; + +@State(Scope.Thread) +public class ArraysSort { + + private final Random srand = new Random(65536); + + @Param({"9000", "16392", "65536", "10485760"}) + private int size; + + private byte[] array; + + @Setup + public final void setup() { + array = new byte[size]; + } + + @Setup(Level.Invocation) + public final void randomize() { + srand.setSeed(65536); + srand.nextBytes(array); + } + + @Benchmark + public void sortBytes() { + Arrays.sort(array); + } + + @Benchmark + public void sortBytesParallel() { + Arrays.parallelSort(array); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/stream/IntegerSum.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/stream/IntegerSum.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.stream; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BinaryOperator; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; + +/** + * JMH Benchmark created to mimic a JSR-166 benchmark + */ +@State(Scope.Benchmark) +public class IntegerSum { + + @Param({"1", "10", "100", "1000", "10000", "100000", "1000000"}) + private int size; + + private ArrayList arrayList; + private HashMap hashMap; + private ConcurrentHashMap concurrentHashMap; + + private static final BinaryOperator sum = (x, y) -> x + y; + + @Setup + public final void setup() { + Random srand = new Random(9820239874L); + Set set = new HashSet<>(size); + while (set.size() < size) { + set.add(srand.nextInt()); + } + Integer[] values = set.toArray(new Integer[size]); + Integer[] keys = Arrays.copyOf(values, size); + + for (int i = 0; i < size; i++) { + swap(values, i, srand.nextInt(values.length)); + swap(keys, i, srand.nextInt(keys.length)); + } + + arrayList = new ArrayList<>(Arrays.asList(keys)); + hashMap = new HashMap<>(size); + concurrentHashMap = new ConcurrentHashMap<>(size); + for (int i = 0; i < size; i++) { + hashMap.put(keys[i], values[i]); + concurrentHashMap.put(keys[i], values[i]); + } + + System.gc(); + } + + private void swap(Integer[] array, int first, int second) { + Integer temp = array[first]; + array[first] = array[second]; + array[second] = temp; + } + + @Benchmark + public Integer ArrayListStream() { + return arrayList.stream().reduce(0, sum); + } + + @Benchmark + public Integer HashMapStream() { + return hashMap.keySet().stream().reduce(0, sum); + } + + @Benchmark + public Integer ConcurrentHashMapStream() { + return concurrentHashMap.keySet().stream().reduce(0, sum); + } + + @Benchmark + public Integer ArrayListParallelStream() { + return arrayList.parallelStream().reduce(0, sum); + } + + @Benchmark + public Integer HashMapParallelStream() { + return hashMap.keySet().parallelStream().reduce(0, sum); + } + + @Benchmark + public Integer ConcurrentHashMapParallelStream() { + return concurrentHashMap.keySet().parallelStream().reduce(0, sum); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/Adler32.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/Adler32.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import org.openjdk.jmh.annotations.Setup; + +/** + * Benchmark for Adler32 + * + */public class Adler32 extends ChecksumBenchmarks { + + @Setup + final public void setupAdler32() { + this.checksum = new java.util.zip.Adler32(); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import org.openjdk.jmh.annotations.Setup; + +/** + * Benchmark for CRC32 + * + */public class CRC32 extends ChecksumBenchmarks { + + @Setup + final public void setupCRC32() { + this.checksum = new java.util.zip.CRC32(); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32C.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32C.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import org.openjdk.jmh.annotations.Setup; + +/** + * Benchmark for CRC32C + * + */ +public class CRC32C extends ChecksumBenchmarks { + + @Setup + final public void setupCRC32C() { + this.checksum = new java.util.zip.CRC32C(); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32CNoIntrinsic.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32CNoIntrinsic.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import org.openjdk.jmh.annotations.Fork; + +/** + * Benchmark for CRC32 that disables any CRC32C intrinstics + * + */ +@Fork(jvmArgs = {"-XX:-UseCRC32CIntrinsics"}) +public class CRC32CNoIntrinsic extends CRC32C { +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32CUnaligned.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32CUnaligned.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import org.openjdk.jmh.annotations.Setup; + +/** + * Benchmark for CRC32C with unaligned accesses + * + */ +public class CRC32CUnaligned extends ChecksumUnalignedBenchmarks { + + @Setup + final public void setupCRC32C() { + this.checksum = new java.util.zip.CRC32C(); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32NoIntrinsic.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/CRC32NoIntrinsic.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import org.openjdk.jmh.annotations.Fork; + +/** + * Benchmark for CRC32 that disables any CRC32 intrinstics + * + */ +@Fork(jvmArgs = {"-XX:-UseCRC32Intrinsics"}) +public class CRC32NoIntrinsic extends CRC32 { +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/ChecksumBenchmarks.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/ChecksumBenchmarks.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.zip.Checksum; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.OperationsPerInvocation; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; + +/** + * + * Base class for benchmarking JDK supported Checksums. + * + * To use the base class extend it and use a setup method configure the checksum + * field. + * + */ +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public abstract class ChecksumBenchmarks { + + private final byte[] bytes_1to9 = "123456789".getBytes(StandardCharsets.US_ASCII); + private final byte[] byteArray_1k = new byte[1024]; + private final byte[] byteArray_64k = new byte[65536]; + private final ByteBuffer wrappedByteBuffer_1k = ByteBuffer.wrap(byteArray_1k); + private final ByteBuffer readonlyByteBuffer_1k = ByteBuffer.wrap(byteArray_1k).asReadOnlyBuffer(); + private final ByteBuffer directByteBuffer_1k = ByteBuffer.allocateDirect(byteArray_1k.length); + private final ByteBuffer wrappedByteBuffer_64k = ByteBuffer.wrap(byteArray_64k); + private final ByteBuffer readonlyByteBuffer_64k = ByteBuffer.wrap(byteArray_64k).asReadOnlyBuffer(); + private final ByteBuffer directByteBuffer_64k = ByteBuffer.allocateDirect(byteArray_64k.length); + + @Setup + final public void setup() { + Random r = new Random(123456789L); + r.nextBytes(byteArray_1k); + r.nextBytes(byteArray_64k); + directByteBuffer_1k.put(byteArray_1k); + directByteBuffer_64k.put(byteArray_64k); + } + + protected Checksum checksum; + + @Benchmark + @OperationsPerInvocation(9) + public void byteArray_9() { + checksum.update(bytes_1to9); + } + + @Benchmark + @OperationsPerInvocation(1024) + public void byteArray_1K() { + checksum.update(byteArray_1k); + } + + @Benchmark + @OperationsPerInvocation(1024) + public void wrappedByteBuffer_1K() { + wrappedByteBuffer_1k.position(0); + checksum.update(wrappedByteBuffer_1k); + } + + @Benchmark + @OperationsPerInvocation(1024) + public void readonlyByteBuffer_1K() { + readonlyByteBuffer_1k.position(0); + checksum.update(readonlyByteBuffer_1k); + } + + @Benchmark + @OperationsPerInvocation(1024) + public void directByteBuffer_1K() { + directByteBuffer_1k.position(0); + checksum.update(directByteBuffer_1k); + } + + @Benchmark + @OperationsPerInvocation(65536) + public void byteArray_64K() { + checksum.update(byteArray_64k); + } + + @Benchmark + @OperationsPerInvocation(65536) + public void wrappedByteBuffer_64K() { + wrappedByteBuffer_64k.position(0); + checksum.update(wrappedByteBuffer_64k); + } + + @Benchmark + @OperationsPerInvocation(65536) + public void readonlyByteBuffer_64K() { + readonlyByteBuffer_64k.position(0); + checksum.update(readonlyByteBuffer_64k); + } + + @Benchmark + @OperationsPerInvocation(65536) + public void directByteBuffer_64K() { + directByteBuffer_64k.position(0); + checksum.update(directByteBuffer_64k); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/ChecksumUnalignedBenchmarks.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/ChecksumUnalignedBenchmarks.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import java.nio.ByteBuffer; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.zip.Checksum; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.OperationsPerInvocation; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; + +/** + * + * Base class for benchmarking JDK supported Checksums with unaligned memory + * accesses. + * + * To use the base class extend it and use a setup method configure the checksum + * field. + * + */ +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public abstract class ChecksumUnalignedBenchmarks { + + private final byte[] unalignedByteArray_1k = new byte[1034]; + private final ByteBuffer unalignedWrappedByteBuffer_1k = ByteBuffer.wrap(unalignedByteArray_1k); + private final ByteBuffer unalignedDirectByteBuffer_1k = ByteBuffer.allocateDirect(unalignedByteArray_1k.length); + + @Setup + final public void setup() { + Random r = new Random(123456789L); + r.nextBytes(unalignedByteArray_1k); + unalignedDirectByteBuffer_1k.put(unalignedByteArray_1k); + } + + protected Checksum checksum; + + @Param({"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}) + private int offset; + + @Benchmark + @OperationsPerInvocation(1024) + public void byteArray_1K() { + checksum.update(unalignedByteArray_1k, offset, 1024); + } + + @Benchmark + @OperationsPerInvocation(1024) + public void wrappedByteBuffer_1K() { + unalignedWrappedByteBuffer_1k.position(offset); + unalignedWrappedByteBuffer_1k.limit(offset + 1024); + checksum.update(unalignedWrappedByteBuffer_1k); + } + + @Benchmark + @OperationsPerInvocation(1024) + public void directByteBuffer_1K() { + unalignedDirectByteBuffer_1k.position(offset); + unalignedWrappedByteBuffer_1k.limit(offset + 1024); + checksum.update(unalignedDirectByteBuffer_1k); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/jdk/java/util/zip/ZipFileDecompression.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/jdk/java/util/zip/ZipFileDecompression.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.jdk.java.util.zip; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.JarURLConnection; +import java.net.URL; +import java.util.Arrays; +import java.util.Base64; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; + +/** + * + * @author sfriberg + */ +@State(Scope.Benchmark) +public class ZipFileDecompression { + + public static enum FILES { + + small_txt, + large_txt, + very_large_txt, + small_class, + large_class, + large_bin, + stored_file; + } + + @Param + private FILES compressedFile; + + private ZipFile zipFile; + + private final Map compressedFiles = new HashMap<>(); + + // Thread private reusable buffers + @State(Scope.Thread) + public static class ThreadLocalBuffers { + + final byte[] bytes = new byte[10 * 1024 * 1024]; + } + + /** + * Create ZIP file used in benchmark + * + * @throws IOException + */ + @Setup + public void setup() throws IOException { + + File file = File.createTempFile(this.getClass().getSimpleName(), ".zip"); + file.deleteOnExit(); + + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(50 * text.length)) { + + // Size of entries in bytes + // small_txt csize 264 size 445 + // large_txt csize 282 size 2225 + // very_large_txt csize 399 size 22250 + // small_class csize 418 size 982 + // large_class csize 4351 size 7702 + // large_bin csize 1048896 size 1048576 + // stored_file csize 2053 size 2048 + writeBytes(zos, FILES.small_txt, text); + + for (int i = 0; i < 5; i++) { + baos.write(text); + } + writeBytes(zos, FILES.large_txt, baos.toByteArray()); + baos.reset(); + + for (int i = 0; i < 50; i++) { + baos.write(text); + } + writeBytes(zos, FILES.very_large_txt, baos.toByteArray()); + baos.reset(); + + writeBytes(zos, FILES.small_class, smallKlass); + + writeBytes(zos, FILES.large_class, largeKlass); + + byte[] largeBinBytes = new byte[1024 * 1024]; + new Random(543210).nextBytes(largeBinBytes); + writeBytes(zos, FILES.large_bin, largeBinBytes); + + // No compression on this entry + zos.setLevel(ZipOutputStream.STORED); + byte[] storedBytes = new byte[2 * 1024]; + new Random(543210).nextBytes(storedBytes); + writeBytes(zos, FILES.stored_file, storedBytes); + } + + zipFile = new ZipFile(file); + + verifyZipFile(); + } + + private void writeBytes(ZipOutputStream zos, FILES file, byte[] bytes) throws IOException { + compressedFiles.put(file, bytes); // Save for verification + zos.putNextEntry(new ZipEntry(file.name())); + zos.write(bytes); + zos.closeEntry(); + } + + @TearDown + public void teardown() throws IOException { + verifyZipFile(); + zipFile.close(); + } + + private void verifyZipFile() { + Enumeration entries = zipFile.entries(); + int count = 0; + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + + try { + FILES filename = FILES.valueOf(entry.getName()); + byte[] extractedFile = new byte[(int) entry.getSize()]; + readFully(zipFile.getInputStream(entry), entry.getSize(), extractedFile); + if (!Arrays.equals(compressedFiles.get(filename), extractedFile)) { + throw new IllegalStateException("Uncompressed file differs from file that was compressed file " + entry.getName()); + } + } catch (IOException ex) { + throw new IllegalStateException("Error reading Zip " + zipFile.getName()); + } catch (IllegalArgumentException ex) { + throw new IllegalStateException("Generated ZIP should not contain " + entry.getName()); + } + count++; + } + if (count != FILES.values().length) { + throw new IllegalStateException("Generated ZIP file does not contain all expected files"); + } + } + + @Benchmark + public void zipEntryInputStream(ThreadLocalBuffers tbb) throws IOException { + ZipEntry entry = zipFile.getEntry(compressedFile.name()); + readFully(zipFile.getInputStream(entry), entry.getSize(), tbb.bytes); + } + + @Benchmark + public void jarURLEntryInputStream(ThreadLocalBuffers tbb) throws IOException { + URL url = new URL("jar:file:" + zipFile.getName() + "!/" + compressedFile.name()); + JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); + readFully(jarConnection.getInputStream(), jarConnection.getContentLengthLong(), tbb.bytes); + } + + private int readFully(InputStream stream, long len, byte[] bytes) throws IOException { + if (len > bytes.length) { + throw new IllegalStateException("byte[] too small to read stream"); + } + int nread = 0, n = 0; + while (nread < len && (n = stream.read(bytes, nread, bytes.length - nread)) > 0) { + nread += n; + } + return nread; + } + + // Data for ZIP file creation + private final byte[] text + = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " + + "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis " + + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " + + "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore " + + "eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt " + + "in culpa qui officia deserunt mollit anim id est laborum.").getBytes(); + private final byte[] smallKlass = Base64.getDecoder().decode( + "yv66vgAAADQAJgcAIgcAIwcAJAEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgEACVNpZ25h" + + "dHVyZQEABihURTspWgEABW9mZmVyAQADcHV0AQAVKExqYXZhL2xhbmcvT2JqZWN0OylWAQAKRXhj" + + "ZXB0aW9ucwcAJQEABihURTspVgEANShMamF2YS9sYW5nL09iamVjdDtKTGphdmEvdXRpbC9jb25j" + + "dXJyZW50L1RpbWVVbml0OylaAQAmKFRFO0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7" + + "KVoBAAR0YWtlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAUoKVRFOwEABHBvbGwBADQoSkxqYXZh" + + "L3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvbGFuZy9PYmplY3Q7AQAlKEpMamF2YS91" + + "dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOwEAEXJlbWFpbmluZ0NhcGFjaXR5AQADKClJAQAG" + + "cmVtb3ZlAQAIY29udGFpbnMBAAdkcmFpblRvAQAZKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspSQEA" + + "HyhMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47KUkBABooTGphdmEvdXRpbC9Db2xsZWN0aW9u" + + "O0kpSQEAIChMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47SSlJAQA+PEU6TGphdmEvbGFuZy9P" + + "YmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvUXVldWU8VEU7PjsBAApTb3VyY2VG" + + "aWxlAQASQmxvY2tpbmdRdWV1ZS5qYXZhAQAiamF2YS91dGlsL2NvbmN1cnJlbnQvQmxvY2tpbmdR" + + "dWV1ZQEAEGphdmEvbGFuZy9PYmplY3QBAA9qYXZhL3V0aWwvUXVldWUBAB5qYXZhL2xhbmcvSW50" + + "ZXJydXB0ZWRFeGNlcHRpb24GAQABAAIAAQADAAAACwQBAAQABQABAAYAAAACAAcEAQAIAAUAAQAG" + + "AAAAAgAHBAEACQAKAAIACwAAAAQAAQAMAAYAAAACAA0EAQAIAA4AAgALAAAABAABAAwABgAAAAIA" + + "DwQBABAAEQACAAsAAAAEAAEADAAGAAAAAgASBAEAEwAUAAIACwAAAAQAAQAMAAYAAAACABUEAQAW" + + "ABcAAAQBABgABQAABAEAGQAFAAAEAQAaABsAAQAGAAAAAgAcBAEAGgAdAAEABgAAAAIAHgACAAYA" + + "AAACAB8AIAAAAAIAIQ=="); + private final byte[] largeKlass = Base64.getDecoder().decode( + "yv66vgAAADQBWAoAngDvBwDwCgACAPEKAAIA8gcA8woAAgD0CgACAPUKAAUA9goAAgD3A4AAAAAK" + + "AAUA+AoABQD5CgACAPoKAPsA8QoAAgD8CgAFAP0KAAUA/goABQD/Bf/////////kCgACAQAKAAIB" + + "AQoAAgECCgAFAQMKAAUBBAoAAgEFCgAFAQYKAPsBBwoA+wEICgD7AQkFAAAAAAAAAAwFAAAAAAAA" + + "AA0HAQoHAQsKACQA7wgBDAoAJAENCgAkAQ4KACQBDwoAIwEQCQAFAREKAPsA8goA+wD0CgAFARIJ" + + "AAUBEwkABQEUCgACARUKAAIBFgkABQEXCgACARgFAAAAAAAAAW0FAAAAAAAAAAQFAAAAAAAAAGQF" + + "AAAAAAAAAZAKARkBGgoBGQEbBQAAAAAAAAACCgACARwKAAIBHQoABQEeBQAAAAAAAAAfBQAAAAAA" + + "AAAcCgAFAR8JAAUBIAcBIQgBIgoASgEjCgACAQcKAAUBJAUAAAAAAAAABwoBGQElBQAAAAAAAjqx" + + "AwAAjqwKARkBJgoBGQEnCgEoASkDAAr5OwMACvqoAwAK/BUDAAr9gwMACv7wAwALAF0DAAsBygMA" + + "CwM4AwALBKUDAAsGEgMACwd/AwALCO0DAAsKWgMACwvHAwALDTQDAAsOogMACxAPAwALEXwDAAsS" + + "6QMACxRXAwALFcQDAAsXMQMACxieAwALGgwDAAsbeQMACxzmAwALHlMDAAsfwQMACyEuAwALIpsD" + + "AAskCAMACyV2AwALJuMDAAsoUAMACym9AwALKysDAAssmAMACy4FAwALL3IDAAsw4AMACzJNAwAL" + + "M7oDAAs1JwMACzaVAwALOAIDAAs5bwMACzrcAwALPEoDAAs9twMACz8kAwALQJEDAAtB/wMAC0Ns" + + "AwALRNkDAAtGRgMAC0e0AwALSSEDAAtKjgMAC0v7AwALTWkDAAtO1gMAC1BDAwALUbADAAtTHgMA" + + "C1SLAwALVfgDAAtXZQMAC1jTAwALWkADAAtbrQcBKgEABERhdGUBAAxJbm5lckNsYXNzZXMBAAdK" + + "QU5VQVJZAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAQEACEZFQlJVQVJZAwAAAAIBAAVNQVJDSAMA" + + "AAADAQAFQVBSSUwDAAAABAEAA01BWQMAAAAFAQAESlVORQMAAAAGAQAESlVMWQMAAAAHAQAGQVVH" + + "VVNUAwAAAAgBAAlTRVBURU1CRVIDAAAACQEAB09DVE9CRVIDAAAACgEACE5PVkVNQkVSAwAAAAsB" + + "AAhERUNFTUJFUgMAAAAMAQAGU1VOREFZAQAGTU9OREFZAQAHVFVFU0RBWQEACVdFRE5FU0RBWQEA" + + "CFRIVVJTREFZAQAGRlJJREFZAQAIU0FUVVJEQVkBAAlCQVNFX1lFQVIDAAAHsgEAC0ZJWEVEX0RB" + + "VEVTAQACW0kBAA1EQVlTX0lOX01PTlRIAQAZQUNDVU1VTEFURURfREFZU19JTl9NT05USAEAHkFD" + + "Q1VNVUxBVEVEX0RBWVNfSU5fTU9OVEhfTEVBUAEAEyRhc3NlcnRpb25zRGlzYWJsZWQBAAFaAQAG" + + "PGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACHZhbGlkYXRlAQAjKExzdW4v" + + "dXRpbC9jYWxlbmRhci9DYWxlbmRhckRhdGU7KVoBAA1TdGFja01hcFRhYmxlBwDwAQAJbm9ybWFs" + + "aXplBwErBwDzBwEsAQAObm9ybWFsaXplTW9udGgBACMoTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVu" + + "ZGFyRGF0ZTspVgEADWdldFllYXJMZW5ndGgBACMoTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVuZGFy" + + "RGF0ZTspSQEAFWdldFllYXJMZW5ndGhJbk1vbnRocwEADmdldE1vbnRoTGVuZ3RoAQAFKElJKUkB" + + "AAxnZXREYXlPZlllYXIBACMoTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVuZGFyRGF0ZTspSgEABihJ" + + "SUkpSgEADGdldEZpeGVkRGF0ZQEAKyhJSUlMc3VuL3V0aWwvY2FsZW5kYXIvQmFzZUNhbGVuZGFy" + + "JERhdGU7KUoBABxnZXRDYWxlbmRhckRhdGVGcm9tRml4ZWREYXRlAQAkKExzdW4vdXRpbC9jYWxl" + + "bmRhci9DYWxlbmRhckRhdGU7SilWAQAMZ2V0RGF5T2ZXZWVrAQAZZ2V0RGF5T2ZXZWVrRnJvbUZp" + + "eGVkRGF0ZQEABChKKUkBABRnZXRZZWFyRnJvbUZpeGVkRGF0ZQEAHWdldEdyZWdvcmlhblllYXJG" + + "cm9tRml4ZWREYXRlAQAKaXNMZWFwWWVhcgEABChJKVoBAAg8Y2xpbml0PgEAClNvdXJjZUZpbGUB" + + "ABFCYXNlQ2FsZW5kYXIuamF2YQwAywDMAQAjc3VuL3V0aWwvY2FsZW5kYXIvQmFzZUNhbGVuZGFy" + + "JERhdGUMAS0BLgwBLwEwAQAec3VuL3V0aWwvY2FsZW5kYXIvQmFzZUNhbGVuZGFyDAExATAMATIB" + + "MAwA3ADdDADlATAMAOUA2gwBMwDQDAE0ATUHASwMATYBNwwBOADfDAE5ANoMANcA2AwBOgE7DAE8" + + "AT0MAT4BOwwA4QDiDADjAOQMAT8BPQwA6gDrDAFAATUMAUEBPQwBQgE9AQAiamF2YS9sYW5nL0ls" + + "bGVnYWxBcmd1bWVudEV4Y2VwdGlvbgEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyAQAVSWxsZWdh" + + "bCBtb250aCB2YWx1ZTogDAFDAUQMAUMBRQwBRgFHDADLAUgMAMYAxQwA3gDgDADIAMUMAMcAxQwB" + + "SQDrDAFKAUsMAMQAxQwBTAFNBwFODAFPAVAMAU8A3QwBSQFRDAFSATAMAOkA5wwA5gDnDADJAMoB" + + "ABhqYXZhL2xhbmcvQXNzZXJ0aW9uRXJyb3IBABVuZWdhdGl2ZSBkYXkgb2Ygd2VlayAMAMsBUwwA" + + "4QDfDAFUAVAMAVQA3QwBVQDrBwFWDAFXAS4BACJzdW4vdXRpbC9jYWxlbmRhci9BYnN0cmFjdENh" + + "bGVuZGFyAQASamF2YS91dGlsL1RpbWVab25lAQAec3VuL3V0aWwvY2FsZW5kYXIvQ2FsZW5kYXJE" + + "YXRlAQAMaXNOb3JtYWxpemVkAQADKClaAQAIZ2V0TW9udGgBAAMoKUkBAA1nZXREYXlPZk1vbnRo" + + "AQARZ2V0Tm9ybWFsaXplZFllYXIBAAx2YWxpZGF0ZVRpbWUBAA1zZXROb3JtYWxpemVkAQAEKFop" + + "VgEAB2dldFpvbmUBABYoKUxqYXZhL3V0aWwvVGltZVpvbmU7AQAHZ2V0VGltZQEADW5vcm1hbGl6" + + "ZVRpbWUBAA1zZXREYXlPZk1vbnRoAQAjKEkpTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVuZGFyRGF0" + + "ZTsBABFzZXROb3JtYWxpemVkWWVhcgEABChJKVYBAAhzZXRNb250aAEADHNldERheU9mV2VlawEA" + + "C3NldExlYXBZZWFyAQANc2V0Wm9uZU9mZnNldAEAEXNldERheWxpZ2h0U2F2aW5nAQAGYXBwZW5k" + + "AQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAcKEkpTGph" + + "dmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsB" + + "ABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAANoaXQBAA1nZXRDYWNoZWRKYW4xAQADKClKAQAIc2V0" + + "Q2FjaGUBAAYoSUpJKVYBAB9zdW4vdXRpbC9jYWxlbmRhci9DYWxlbmRhclV0aWxzAQALZmxvb3JE" + + "aXZpZGUBAAUoSkopSgEABChKKVoBAA1nZXRDYWNoZWRZZWFyAQAVKExqYXZhL2xhbmcvT2JqZWN0" + + "OylWAQADbW9kAQATaXNHcmVnb3JpYW5MZWFwWWVhcgEAD2phdmEvbGFuZy9DbGFzcwEAFmRlc2ly" + + "ZWRBc3NlcnRpb25TdGF0dXMEIQAFAJ4AAAAZABkAoQCiAAEAowAAAAIApAAZAKUAogABAKMAAAAC" + + "AKYAGQCnAKIAAQCjAAAAAgCoABkAqQCiAAEAowAAAAIAqgAZAKsAogABAKMAAAACAKwAGQCtAKIA" + + "AQCjAAAAAgCuABkArwCiAAEAowAAAAIAsAAZALEAogABAKMAAAACALIAGQCzAKIAAQCjAAAAAgC0" + + "ABkAtQCiAAEAowAAAAIAtgAZALcAogABAKMAAAACALgAGQC5AKIAAQCjAAAAAgC6ABkAuwCiAAEA" + + "owAAAAIApAAZALwAogABAKMAAAACAKYAGQC9AKIAAQCjAAAAAgCoABkAvgCiAAEAowAAAAIAqgAZ" + + "AL8AogABAKMAAAACAKwAGQDAAKIAAQCjAAAAAgCuABkAwQCiAAEAowAAAAIAsAAaAMIAogABAKMA" + + "AAACAMMAGgDEAMUAAAAYAMYAxQAAABgAxwDFAAAAGADIAMUAABAYAMkAygAAABQAAQDLAMwAAQDN" + + "AAAAIQABAAEAAAAFKrcAAbEAAAABAM4AAAAKAAIAAAAnAAQAjwABAM8A0AABAM0AAADWAAQABgAA" + + "AGUrwAACTSy2AAOZAAUErCy2AAQ+HQShAAkdEAykAAUDrCy2AAY2BBUEngARFQQqLLYABx23AAik" + + "AAUDrCy2AAk2BRUFEgqfAA8VBSostgALnwAFA6wqK7YADJoABQOsLAS2AA0ErAAAAAIAzgAAAEIA" + + "EAAAAMAABQDBAAwAwgAOAMQAEwDFAB4AxgAgAMgAJgDJADkAygA7AMwAQQDNAFIAzgBUANEAXADS" + + "AF4A1QBjANYA0QAAABcAB/wADgcA0vwADwEB/AAYAQH8ABgBCQABANMA0AABAM0AAAIJAAcADAAA" + + "ASkrtgAOmQAFBKwrwAACTSy2AA9OLcYACyortgAQWASsKiy2ABE2BCostgASLLYABoUVBIVhNwUs" + + "tgAENgcstgAHNggqFQgVB7cACDYJFgUJlJ4ADBYFFQmFlJ4AqhYFCZSdAEQWBRQAE5SeADsqFQiE" + + "B/8VB7cACDYJFgUVCYVhNwUsFgWItgAVVxUHmgAPEAw2BywVCARktgAWLBUHtgAXV6cAaxYFFQmF" + + "lJ4APhYFFQkQHGCFlJwAMhYFFQmFZTcFhAcBLBYFiLYAFVcVBxAMpAAOLBUIBGC2ABYENgcsFQe2" + + "ABdXpwAnFgUqFQgVBwQstgAYYQplNwoqLBYKtgAZpwAMLCostgALtgAaKyostgAHtgAbtgAcKwO2" + + "AB0rA7YAHiwEtgANBKwAAAACAM4AAACeACcAAADaAAcA2wAJAN4ADgDfABMA4wAXAOQAHQDlAB8A" + + "6AAmAOkAKwDqADYA6wA8AOwAQgDtAEwA7wBcAPAAbADxAHkA8gCBAPMAiQD0AI4A9QCSAPYAmgD4" + + "AKQA+QC5APoAwQD7AMQA/ADMAP0A0wD+ANsA/wDeAQEA6AEDAPkBBAEAAQUBAwEHAQwBCQEYAQoB" + + "HQELASIBDAEnAQ0A0QAAACoACQn9ABUHANIHANT/ADwACQcA1QcA1gcA0gcA1AEEAQEBAAA9CTkJ" + + "GggAAADXANgAAQDNAAAA1gAGAAgAAAB1K8AAAk0stgAHPiy2AASFNwQWBAmUnQAxChYEZTcGHRYG" + + "FAAfbQphiGQ+FAAhFgYUAB9xZTcELB22ABYsFgSItgAXV6cAMRYEFAAflJ4AKB0WBAplFAAfbYhg" + + "PhYECmUUAB9xCmE3BCwdtgAWLBYEiLYAF1exAAAAAgDOAAAAPgAPAAABEQAFARIACgETABEBFAAY" + + "ARUAHgEWACoBFwA2ARgAOwEZAEMBGgBPARsAWwEcAGcBHQBsAR4AdAEgANEAAAALAAL+AEYHANIB" + + "BC0AAQDZANoAAQDNAAAAOwACAAIAAAAYKivAAAK2AAe2ABuZAAkRAW6nAAYRAW2sAAAAAgDOAAAA" + + "BgABAAABLwDRAAAABQACFEIBAAEA2wDaAAEAzQAAABsAAQACAAAAAxAMrAAAAAEAzgAAAAYAAQAA" + + "ATMAAQDcANoAAQDNAAAAcgAEAAQAAAA6K8AAAk0stgAEPh0EoQAJHRAMpAAeuwAjWbsAJFm3ACUS" + + "JrYAJx22ACi2ACm3ACq/Kiy2AAcdtwAIrAAAAAIAzgAAABYABQAAAUIABQFDAAoBRAAVAUUAMAFH" + + "ANEAAAAKAAL9ABUHANIBGgACANwA3QABAM0AAABIAAIABAAAABiyACscLj4cBaAADiobtgAbmQAG" + + "hAMBHawAAAACAM4AAAASAAQAAAFMAAYBTQATAU4AFgFQANEAAAAGAAH8ABYBAAEA3gDfAAEAzQAA" + + "ADgABAACAAAAFCorwAACtgAHK7YALCu2AC22AC6tAAAAAQDOAAAAEgAEAAABVAAJAVUADQFWABAB" + + "VAAQAN4A4AABAM0AAABPAAQABAAAABodhSobtgAbmQALsgAvHC6nAAiyADAcLoVhrQAAAAIAzgAA" + + "AAoAAgAAAVoABAFbANEAAAATAAJSBP8ABAAEBwDVAQEBAAIEAQABAOEA3wABAM0AAABZAAUAAgAA" + + "ACQrtgAOmgAIKiu2ABIqK8AAArYAByu2ACwrtgAtK8AAArYAGK0AAAACAM4AAAAaAAYAAAFhAAcB" + + "YgAMAWQAFQFlABkBZgAgAWQA0QAAAAMAAQwAAQDhAOIAAQDNAAACVwAIAAsAAAFEHASgAAwdBKAA" + + "BwSnAAQDNgUZBMYAJxkEG7YAMZkAHhUFmQAJGQS2ADKtGQS2ADIqGxwdtgAuYQplrRsRB7JkNgYV" + + "BpsAShUGsgAzvqIAQbIAMxUGLoU3BxkExgAcGQQbFgcqG7YAG5kACREBbqcABhEBbbYANBUFmQAI" + + "FgenAA8WByobHB22AC5hCmWtG4UKZTcHHYU3CRYHCZSbADQWCRQANRYHaRYHFAA3bWEWBxQAOW1l" + + "FgcUADttYREBbxxoEQFqZBAMbIVhYTcJpwA5FgkUADUWB2kWBxQAN7gAPWEWBxQAObgAPWUWBxQA" + + "O7gAPWERAW8caBEBamQQDLgAPoVhYTcJHAWkABcWCSobtgAbmQAHCqcABhQAP2U3CRkExgAhFQWZ" + + "ABwZBBsWCSobtgAbmQAJEQFupwAGEQFttgA0FgmtAAAAAgDOAAAAZgAZAAABbAARAW8AHwFwACQB" + + "cQAqAXMAOgF3AEEBeABPAXkAWAF6AF0BewB2AX0AjQGAAJMBgQCXAYMAngGEAM8BigDcAYsA5QGM" + + "AO4BjQD9AY4BBQGRAQoBkgEeAZYBKAGXAUEBmgDRAAAAlQASDkAB/AAaAQ//ADUACAcA1QEBAQcA" + + "0gEBBAADBwDSAQT/AAIACAcA1QEBAQcA0gEBBAAEBwDSAQQBAglLBPoAAP0AQQQENVIE/wACAAkH" + + "ANUBAQEHANIBAQQEAAIEBAL/ABwACQcA1QEBAQcA0gEBBAQAAwcA0gEE/wACAAkHANUBAQEHANIB" + + "AQQEAAQHANIBBAECAAEA4wDkAAEAzQAAAjUABQARAAABMSvAAAI6BBkEILYAQZkAHBkEtgBCNgUZ" + + "BLYAMjcGKhUFtgAbNginADQqILYAQzYFKhUFBAQBtgAYNwYqFQW2ABs2CBkEFQUWBhUImQAJEQFu" + + "pwAGEQFttgA0IBYGZYg2CRYGFABEYRQARmE3ChUImQAJFgoKYTcKIBYKlJsAEhUJFQiZAAcEpwAE" + + "BWA2CRAMFQloEQF1YDYMFQyeAA4VDBEBb2w2DKcADRUMEQFvuAA+NgwWBrIAMBUMLoVhNw0VCJkA" + + "DxUMBqEACRYNCmE3DSAWDWWIBGA2DyC4AEg2ELIASZoAJBUQnQAfuwBKWbsAJFm3ACUSS7YAJxUQ" + + "tgAotgAptwBMvxkEFQW2ABYZBBUMtgAXVxkEFQ+2ABVXGQQVELYAGhkEFQi2AE0ZBAS2AA2xAAAA" + + "AgDOAAAAggAgAAABpAAGAagADwGpABYBqgAdAasAKAGwAC8BsQA6AbIAQgG0AFkBtwBgAbgAbAG5" + + "AHEBugB3AbwAfgG9AI0BvwCYAcAAnQHBAKgBwwCyAcUAvgHGAMkBxwDPAckA2AHKAN4BywEFAcwB" + + "DAHNARQBzgEcAc8BIwHQASoB0QEwAdIA0QAAAGoADPwAKAcA0v8AKgAHBwDVBwDWBAcA0gEEAQAD" + + "BwDSAQT/AAIABwcA1QcA1gQHANIBBAEABAcA0gEEAQL9AB0BBFEB/wAAAAkHANUHANYEBwDSAQQB" + + "AQQAAgEBAvwAGgEJ/AAcBP0ANQEBAAEA5QDaAAEAzQAAACcAAgAEAAAACyortgBOQSC4AEisAAAA" + + "AQDOAAAACgACAAAB2AAGAdkAGQDmAOcAAQDNAAAAQwAEAAIAAAAaHgmUmwAMHhQAT3GIBGCsHhQA" + + "T7gAUYgEYKwAAAACAM4AAAAOAAMAAAHeAAYB3wAPAeEA0QAAAAMAAQ8AAQDoAOcAAQDNAAAAHgAD" + + "AAMAAAAGKh+2AEOsAAAAAQDOAAAABgABAAAB5QAQAOkA5wABAM0AAAFcAAQADgAAAMkfCZSeAEof" + + "CmVCIRQAUm2INgkhFABScYg2BRUFElRsNgoVBRJUcDYGFQYRBbVsNgsVBhEFtXA2BxUHEQFtbDYM" + + "FQcRAW1wBGA2CKcAVx8KZUIhFABSuAA9iDYJIRQAUrgAUYg2BRUFElS4AD42ChUFElS4AFU2BhUG" + + "EQW1uAA+NgsVBhEFtbgAVTYHFQcRAW24AD42DBUHEQFtuABVBGA2CBEBkBUJaBBkFQpoYAcVC2hg" + + "FQxgNg0VCgefAAwVDAefAAaEDQEVDawAAAACAM4AAABeABcAAAHxAAYB8gAKAfMAEgH0ABoB9QAh" + + "AfYAKAH3ADAB+AA4AfkAQAH6AE0B/ABRAf0AWwH+AGUB/wBuAgAAdwIBAIECAgCLAgMAlQIEAKEC" + + "BgC3AgcAwwIIAMYCCgDRAAAAHQAD+wBN/wBTAAsHANUEBAEBAQEBAQEBAAD8ACQBAAQA6gDQAAEA" + + "zQAAACQAAgACAAAADCorwAACtgAHtgAbrAAAAAEAzgAAAAYAAQAAAhMAAADqAOsAAQDNAAAAHQAB" + + "AAIAAAAFG7gAVqwAAAABAM4AAAAGAAEAAAIXAAgA7ADMAAEAzQAAAuIABAAAAAACrxIFtgBXmgAH" + + "BKcABAOzAEkQRrwKWQMSWE9ZBBJZT1kFElpPWQYSW09ZBxJcT1kIEl1PWRAGEl5PWRAHEl9PWRAI" + + "EmBPWRAJEmFPWRAKEmJPWRALEmNPWRAMEmRPWRANEmVPWRAOEmZPWRAPEmdPWRAQEmhPWRAREmlP" + + "WRASEmpPWRATEmtPWRAUEmxPWRAVEm1PWRAWEm5PWRAXEm9PWRAYEnBPWRAZEnFPWRAaEnJPWRAb" + + "EnNPWRAcEnRPWRAdEnVPWRAeEnZPWRAfEndPWRAgEnhPWRAhEnlPWRAiEnpPWRAjEntPWRAkEnxP" + + "WRAlEn1PWRAmEn5PWRAnEn9PWRAoEoBPWRApEoFPWRAqEoJPWRArEoNPWRAsEoRPWRAtEoVPWRAu" + + "EoZPWRAvEodPWRAwEohPWRAxEolPWRAyEopPWRAzEotPWRA0EoxPWRA1Eo1PWRA2Eo5PWRA3Eo9P" + + "WRA4EpBPWRA5EpFPWRA6EpJPWRA7EpNPWRA8EpRPWRA9EpVPWRA+EpZPWRA/EpdPWRBAEphPWRBB" + + "EplPWRBCEppPWRBDEptPWRBEEpxPWRBFEp1PswAzEA28ClkDEB9PWQQQH09ZBRAcT1kGEB9PWQcQ" + + "Hk9ZCBAfT1kQBhAeT1kQBxAfT1kQCBAfT1kQCRAeT1kQChAfT1kQCxAeT1kQDBAfT7MAKxANvApZ" + + "AxDiT1kEA09ZBRAfT1kGEDtPWQcQWk9ZCBB4T1kQBhEAl09ZEAcRALVPWRAIEQDUT1kQCREA809Z" + + "EAoRARFPWRALEQEwT1kQDBEBTk+zADAQDbwKWQMQ4k9ZBANPWQUQH09ZBhA8T1kHEFtPWQgQeU9Z" + + "EAYRAJhPWRAHEQC2T1kQCBEA1U9ZEAkRAPRPWRAKEQEST1kQCxEBMU9ZEAwRAU9PswAvsQAAAAIA" + + "zgAAABYABQAAACcAEABGAbUBNgIEATkCWQE9ANEAAAAFAAIMQAEAAgDtAAAAAgDuAKAAAAAKAAEA" + + "AgAFAJ8ECQ=="); +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/org/openjdk/micro/util/SecurityManagerHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/micro/util/SecurityManagerHelper.java Tue Oct 02 11:53:46 2018 +0200 @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.micro.util; + +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.net.URI; +import java.security.NoSuchAlgorithmException; +import java.security.Permission; +import java.security.Policy; +import java.security.URIParameter; + +/** + * Help class to create and load Security Policy file from a set of Permissions + */ +public class SecurityManagerHelper { + + /** + * Create and load a security manager using the provided permissions. + * + * @param perms Permissions to add to the file + * + * @throws IOException If file could not be created or written to. + * @throws NoSuchAlgorithmException if no Provider supports a PolicySpi + * implementation for the specified type. + */ + public static void setupSecurityManager(Permission... perms) + throws IOException, NoSuchAlgorithmException { + + URI policyURI = createSecurityFile(perms); + Policy.setPolicy(Policy.getInstance("JavaPolicy", new URIParameter(policyURI))); + System.setSecurityManager(new SecurityManager()); + } + + private static URI createSecurityFile(Permission... perms) throws IOException { + + File policyFile = File.createTempFile("security", ".policy"); + policyFile.deleteOnExit(); + + try (PrintStream writer = new PrintStream(policyFile)) { + writer.println("grant {"); + for (Permission p : perms) { + appendPermission(writer, p); + } + // Permissions required by JMH + appendPermission(writer, new RuntimePermission("modifyThread")); + // Required when running without forking +// appendPermission(writer, new RuntimePermission("accessDeclaredMembers")); +// appendPermission(writer, new RuntimePermission("createSecurityManager")); +// appendPermission(writer, new ReflectPermission("suppressAccessChecks")); +// appendPermission(writer, new ManagementPermission("monitor")); +// appendPermission(writer, new PropertyPermission("jmh.scorePrecision", "read")); + writer.println("};"); + } + + return policyFile.toURI(); + } + + private static void appendPermission(PrintStream writer, Permission p) { + writer.printf("\tpermission %s \"%s\", \"%s\";\n", + p.getClass().getName(), p.getName(), p.getActions()); + } +} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/hotspot/gc/g1/WriteBarrier.java --- a/test/micro/src/classes/org/openjdk/micro/hotspot/gc/g1/WriteBarrier.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.hotspot.gc.g1; - -import java.lang.management.GarbageCollectorMXBean; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryPoolMXBean; -import java.util.HashMap; -import java.util.List; -import java.util.LinkedList; -import java.util.concurrent.TimeUnit; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Measurement; -import org.openjdk.jmh.annotations.OperationsPerInvocation; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.TearDown; -import org.openjdk.jmh.annotations.Warmup; - -/** - * Several different tests cases of reference writes that might require write - * barrier depending on the GC used. Multiple sub-classes available with - * specific command line options set to test G1, Parallel GC and CMS. - * - * @author staffan.friberg@oracle.com (sfriberg) - */ -@State(Scope.Benchmark) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -@Warmup(iterations = 5) -@Measurement(iterations = 5) -@Fork(jvmArgsAppend = {"-XX:+UseG1GC", "-Xmx256m", "-Xms256m", "-Xmn64m"}, value = 5) -public class WriteBarrier { - - // Datastructures that enables writes between different parts and regions on the heap - private Object oldReferee_region1; - private Object oldReferee_region2; - private Object youngReferee_region3; - private Object youngReferee_region4; - private Object nullReferee = null; - - private static final int OLD_REFERENCES_LENGTH = 131072; - private final Holder[] oldReferences = new Holder[OLD_REFERENCES_LENGTH]; - private Holder oldReference_region1; - private Holder youngReference_region3; - - // Keep alive to avoid them being garbage collected but not used in benchmarks - private final LinkedList padding = new LinkedList<>(); - private final LinkedList liveData = new LinkedList<>(); - private final HashMap gcCount = new HashMap<>(); - - /** - * Setup method for the benchmarks - * - * Allocate objects in a certain order to make sure the end up on the heap - * in the right way to later use them in tests. - */ - @Setup - public void setup() { - // Allocate together and System.gc to move them to Old Space and - // keep in the same region by doing a fast promotion - oldReferee_region1 = new Object(); - oldReference_region1 = new Holder(oldReferee_region1); - System.gc(); - - // Fill up old space to 80% - List pools = ManagementFactory.getMemoryPoolMXBeans(); - for (MemoryPoolMXBean pool : pools) { - if (pool.getName().contains("Old Gen")) { - pool.setUsageThreshold((pool.getUsage().getMax() / 5) * 4); - - while (!pool.isUsageThresholdExceeded()) { - // Allocate new referee and and then increase live data count - // and force promotion until heap is full enough. The last - // oldReferee will most likely be located in a different region - // compared to the the initially allocated objects. - oldReferee_region2 = new Object(); - for (int i = 0; i < 10000; i++) { - liveData.add(new Holder(new byte[512], new Object())); - } - } - break; - } - } - int index = 0; - for (Holder holder : liveData) { - if (index < oldReferences.length) { - oldReferences[index++] = holder; - } - } - - // Allocate reference and referee together to keep them in same region - // Allocate Object first so they are located in the same memory order - // as objects in old space - youngReferee_region3 = new Object(); - youngReference_region3 = new Holder(youngReferee_region3); - - // Allocate padding and a new referee to make sure the reference and - // referee are in different regions - for (int i = 0; i < 2000; i++) { - Holder tempHolder = new Holder(new byte[500], new Object()); - padding.add(tempHolder); - youngReferee_region4 = tempHolder.getReference(); - } - - /* - * Get GC numbers after all allocation but before any benchmark execution - * starts to verify that no GCs happen during the benchmarking it self as - * object will then move. - */ - List gcBeans = ManagementFactory.getGarbageCollectorMXBeans(); - for (GarbageCollectorMXBean gcBean : gcBeans) { - gcCount.put(gcBean.getName(), gcBean.getCollectionCount()); - } - } - - /** - * Invalidate any benchmark result if a GC occurs during execution of - * benchmark as moving objects will destroy the assumptions of the tests - */ - @TearDown(Level.Iteration) - public void checkGCCount() { - List gcBeans = ManagementFactory.getGarbageCollectorMXBeans(); - for (GarbageCollectorMXBean gcBean : gcBeans) { - if (gcBean.getCollectionCount() != gcCount.get(gcBean.getName())) { - throw new RuntimeException("A GC has happened during iteration and the microbenchmark result is invalid."); - } - } - } - - /** - * Write a reference in an object located in the old space and where the - * written pointer is to a old object in the same region - */ - @Benchmark - public void oldPointingToOldInSameRegion() { - oldReference_region1.setReference(oldReferee_region1); - } - - /** - * Write a reference in an object located in the old space and where the - * written pointer is to a old object in a different region - */ - @Benchmark - public void oldPointingToOldInDifferentRegion() { - oldReference_region1.setReference(oldReferee_region2); - } - - /** - * Write a reference in an object located in the old space and where the - * written pointer is to an object in the young space - */ - @Benchmark - public void oldPointingToYoungInDifferentRegion() { - oldReference_region1.setReference(youngReferee_region3); - } - - /** - * Write a reference in an object located in the young space and where the - * written pointer is to an object in the old space - */ - @Benchmark - public void youngPointingToOldInDifferentRegion() { - youngReference_region3.setReference(oldReferee_region2); - } - - /** - * Write a reference in an object located in the young space and where the - * written pointer is to a young object in the same region - */ - @Benchmark - public void youngPointingToYoungInSameRegion() { - youngReference_region3.setReference(youngReferee_region3); - } - - /** - * Write a reference in an object located in the young space and where the - * written pointer is to a young object in a different region - */ - @Benchmark - public void youngPointingToYoungInDifferentRegion() { - youngReference_region3.setReference(youngReferee_region4); - } - - /** - * Write by compiler provable null to an object located in old space - */ - @Benchmark - public void oldPointingToExplicitNull() { - oldReference_region1.setReference(null); - } - - /** - * Write by compiler unprovable null to an object located in old space - */ - @Benchmark - public void oldPointingToImplicitNull() { - oldReference_region1.setReference(nullReferee); - } - - /** - * Write by compiler provable null to an object located in young space - */ - @Benchmark - public void youngPointingToExplicitNull() { - youngReference_region3.setReference(null); - } - - /** - * Write by compiler unprovable null to an object located in young space - */ - @Benchmark - public void youngPointingToImplicitNull() { - youngReference_region3.setReference(nullReferee); - } - - /** - * Iterate and update over many old references to point to a young object. - * Since they are in different regions we will need to check the card, and - * since we will update many different reference in different memory - * locations/cards the card will need to be queued as no filtering will - * catch it. - */ - @Benchmark - @OperationsPerInvocation(value = OLD_REFERENCES_LENGTH) - public void manyOldPointingToYoung() { - for (Holder oldReference : oldReferences) { - oldReference.setReference(youngReferee_region3); - } - } - - /** - * Iterate and update over many old references to point to explicit null. - */ - @Benchmark - @OperationsPerInvocation(value = OLD_REFERENCES_LENGTH) - public void manyOldPointingToExplicitNull() { - for (Holder oldReference : oldReferences) { - oldReference.setReference(null); - } - } - - /** - * Iterate and update over many old references to point to implicit null. - */ - @Benchmark - @OperationsPerInvocation(value = OLD_REFERENCES_LENGTH) - public void manyOldPointingToImplicitNull() { - for (Holder oldReference : oldReferences) { - oldReference.setReference(nullReferee); - } - } - - /* - * Holder object for reference and padding - */ - static class Holder { - - private Object reference; - private final byte[] padding; - - public Holder(Object reference) { - this(null, reference); - } - - public Holder(byte[] padding, Object reference) { - this.padding = padding; - this.reference = reference; - } - - public void setReference(Object reference) { - this.reference = reference; - } - - public Object getReference() { - return this.reference; - } - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/lang/reflect/GetMethods.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/lang/reflect/GetMethods.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.lang.reflect; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.concurrent.TimeUnit; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Measurement; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Warmup; - -@OutputTimeUnit(TimeUnit.MILLISECONDS) -@Warmup(iterations = 5) -@Measurement(iterations = 5) -@Fork(jvmArgsAppend = {"-Xms1g", "-Xmx1g", "-Xmn768m", "-XX:+UseParallelGC"}, value = 5) -public class GetMethods { - - public static class InternalClass { - - public InternalClass() { - } - - @Override - public String toString() { - return InternalClass.class.getName(); - } - } - - /** - * Get the constructor through reflection on a class in the same classloader - * - * @return the constructor - * @throws NoSuchMethodException - */ - @Benchmark - public Constructor getConstructor() throws NoSuchMethodException { - return InternalClass.class.getConstructor(); - } - - /** - * Get the constructor through reflection on a class in a different classloader - * - * @return the constructor - * @throws NoSuchMethodException - */ - @Benchmark - public Constructor getConstructorDifferentClassLoader() throws NoSuchMethodException { - return String.class.getConstructor(); - } - - /** - * Get the toString method through reflection on a class in the same classloader - * - * @return the toString method - * @throws java.lang.NoSuchMethodException - */ - @Benchmark - public Method getMethod() throws NoSuchMethodException { - return InternalClass.class.getMethod("toString"); - } - - /** - * Get the toString method through reflection on a class in a different classloader - * - * @return the toString method - * @throws NoSuchMethodException - */ - @Benchmark - public Method getMethodDifferentClassLoader() throws NoSuchMethodException { - return String.class.getMethod("toString"); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/lang/reflect/GetMethodsWithSecurityManager.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/lang/reflect/GetMethodsWithSecurityManager.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.lang.reflect; - -import java.io.IOException; -import java.security.NoSuchAlgorithmException; -import java.security.Permission; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.micro.util.SecurityManagerHelper; - -/** - * Test performance of Reflection with a Security Manager enabled - */ -@State(Scope.Benchmark) -public class GetMethodsWithSecurityManager extends GetMethods { - - /** - * Extract and load the security.policy - * - * @throws IOException - * @throws NoSuchAlgorithmException - */ - @Setup - public void setup() throws IOException, NoSuchAlgorithmException { - SecurityManagerHelper.setupSecurityManager(new Permission[0]); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/ArraysSort.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/ArraysSort.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util; - -import java.util.Arrays; -import java.util.Random; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; - -@State(Scope.Thread) -public class ArraysSort { - - private final Random srand = new Random(65536); - - @Param({"9000", "16392", "65536", "10485760"}) - private int size; - - private byte[] array; - - @Setup - public final void setup() { - array = new byte[size]; - } - - @Setup(Level.Invocation) - public final void randomize() { - srand.setSeed(65536); - srand.nextBytes(array); - } - - @Benchmark - public void sortBytes() { - Arrays.sort(array); - } - - @Benchmark - public void sortBytesParallel() { - Arrays.parallelSort(array); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/stream/IntegerSum.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/stream/IntegerSum.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.stream; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BinaryOperator; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; - -/** - * JMH Benchmark created to mimic a JSR-166 benchmark - */ -@State(Scope.Benchmark) -public class IntegerSum { - - @Param({"1", "10", "100", "1000", "10000", "100000", "1000000"}) - private int size; - - private ArrayList arrayList; - private HashMap hashMap; - private ConcurrentHashMap concurrentHashMap; - - private static final BinaryOperator sum = (x, y) -> x + y; - - @Setup - public final void setup() { - Random srand = new Random(9820239874L); - Set set = new HashSet<>(size); - while (set.size() < size) { - set.add(srand.nextInt()); - } - Integer[] values = set.toArray(new Integer[size]); - Integer[] keys = Arrays.copyOf(values, size); - - for (int i = 0; i < size; i++) { - swap(values, i, srand.nextInt(values.length)); - swap(keys, i, srand.nextInt(keys.length)); - } - - arrayList = new ArrayList<>(Arrays.asList(keys)); - hashMap = new HashMap<>(size); - concurrentHashMap = new ConcurrentHashMap<>(size); - for (int i = 0; i < size; i++) { - hashMap.put(keys[i], values[i]); - concurrentHashMap.put(keys[i], values[i]); - } - - System.gc(); - } - - private void swap(Integer[] array, int first, int second) { - Integer temp = array[first]; - array[first] = array[second]; - array[second] = temp; - } - - @Benchmark - public Integer ArrayListStream() { - return arrayList.stream().reduce(0, sum); - } - - @Benchmark - public Integer HashMapStream() { - return hashMap.keySet().stream().reduce(0, sum); - } - - @Benchmark - public Integer ConcurrentHashMapStream() { - return concurrentHashMap.keySet().stream().reduce(0, sum); - } - - @Benchmark - public Integer ArrayListParallelStream() { - return arrayList.parallelStream().reduce(0, sum); - } - - @Benchmark - public Integer HashMapParallelStream() { - return hashMap.keySet().parallelStream().reduce(0, sum); - } - - @Benchmark - public Integer ConcurrentHashMapParallelStream() { - return concurrentHashMap.keySet().parallelStream().reduce(0, sum); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/Adler32.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/Adler32.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import org.openjdk.jmh.annotations.Setup; - -/** - * Benchmark for Adler32 - * - */public class Adler32 extends ChecksumBenchmarks { - - @Setup - final public void setupAdler32() { - this.checksum = new java.util.zip.Adler32(); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import org.openjdk.jmh.annotations.Setup; - -/** - * Benchmark for CRC32 - * - */public class CRC32 extends ChecksumBenchmarks { - - @Setup - final public void setupCRC32() { - this.checksum = new java.util.zip.CRC32(); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32C.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32C.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import org.openjdk.jmh.annotations.Setup; - -/** - * Benchmark for CRC32C - * - */ -public class CRC32C extends ChecksumBenchmarks { - - @Setup - final public void setupCRC32C() { - this.checksum = new java.util.zip.CRC32C(); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32CNoIntrinsic.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32CNoIntrinsic.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import org.openjdk.jmh.annotations.Fork; - -/** - * Benchmark for CRC32 that disables any CRC32C intrinstics - * - */ -@Fork(jvmArgs = {"-XX:-UseCRC32CIntrinsics"}) -public class CRC32CNoIntrinsic extends CRC32C { -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32CUnaligned.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32CUnaligned.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import org.openjdk.jmh.annotations.Setup; - -/** - * Benchmark for CRC32C with unaligned accesses - * - */ -public class CRC32CUnaligned extends ChecksumUnalignedBenchmarks { - - @Setup - final public void setupCRC32C() { - this.checksum = new java.util.zip.CRC32C(); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32NoIntrinsic.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/CRC32NoIntrinsic.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import org.openjdk.jmh.annotations.Fork; - -/** - * Benchmark for CRC32 that disables any CRC32 intrinstics - * - */ -@Fork(jvmArgs = {"-XX:-UseCRC32Intrinsics"}) -public class CRC32NoIntrinsic extends CRC32 { -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/ChecksumBenchmarks.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/ChecksumBenchmarks.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Random; -import java.util.concurrent.TimeUnit; -import java.util.zip.Checksum; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.OperationsPerInvocation; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; - -/** - * - * Base class for benchmarking JDK supported Checksums. - * - * To use the base class extend it and use a setup method configure the checksum - * field. - * - */ -@State(Scope.Thread) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -public abstract class ChecksumBenchmarks { - - private final byte[] bytes_1to9 = "123456789".getBytes(StandardCharsets.US_ASCII); - private final byte[] byteArray_1k = new byte[1024]; - private final byte[] byteArray_64k = new byte[65536]; - private final ByteBuffer wrappedByteBuffer_1k = ByteBuffer.wrap(byteArray_1k); - private final ByteBuffer readonlyByteBuffer_1k = ByteBuffer.wrap(byteArray_1k).asReadOnlyBuffer(); - private final ByteBuffer directByteBuffer_1k = ByteBuffer.allocateDirect(byteArray_1k.length); - private final ByteBuffer wrappedByteBuffer_64k = ByteBuffer.wrap(byteArray_64k); - private final ByteBuffer readonlyByteBuffer_64k = ByteBuffer.wrap(byteArray_64k).asReadOnlyBuffer(); - private final ByteBuffer directByteBuffer_64k = ByteBuffer.allocateDirect(byteArray_64k.length); - - @Setup - final public void setup() { - Random r = new Random(123456789L); - r.nextBytes(byteArray_1k); - r.nextBytes(byteArray_64k); - directByteBuffer_1k.put(byteArray_1k); - directByteBuffer_64k.put(byteArray_64k); - } - - protected Checksum checksum; - - @Benchmark - @OperationsPerInvocation(9) - public void byteArray_9() { - checksum.update(bytes_1to9); - } - - @Benchmark - @OperationsPerInvocation(1024) - public void byteArray_1K() { - checksum.update(byteArray_1k); - } - - @Benchmark - @OperationsPerInvocation(1024) - public void wrappedByteBuffer_1K() { - wrappedByteBuffer_1k.position(0); - checksum.update(wrappedByteBuffer_1k); - } - - @Benchmark - @OperationsPerInvocation(1024) - public void readonlyByteBuffer_1K() { - readonlyByteBuffer_1k.position(0); - checksum.update(readonlyByteBuffer_1k); - } - - @Benchmark - @OperationsPerInvocation(1024) - public void directByteBuffer_1K() { - directByteBuffer_1k.position(0); - checksum.update(directByteBuffer_1k); - } - - @Benchmark - @OperationsPerInvocation(65536) - public void byteArray_64K() { - checksum.update(byteArray_64k); - } - - @Benchmark - @OperationsPerInvocation(65536) - public void wrappedByteBuffer_64K() { - wrappedByteBuffer_64k.position(0); - checksum.update(wrappedByteBuffer_64k); - } - - @Benchmark - @OperationsPerInvocation(65536) - public void readonlyByteBuffer_64K() { - readonlyByteBuffer_64k.position(0); - checksum.update(readonlyByteBuffer_64k); - } - - @Benchmark - @OperationsPerInvocation(65536) - public void directByteBuffer_64K() { - directByteBuffer_64k.position(0); - checksum.update(directByteBuffer_64k); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/ChecksumUnalignedBenchmarks.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/ChecksumUnalignedBenchmarks.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import java.nio.ByteBuffer; -import java.util.Random; -import java.util.concurrent.TimeUnit; -import java.util.zip.Checksum; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.OperationsPerInvocation; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; - -/** - * - * Base class for benchmarking JDK supported Checksums with unaligned memory - * accesses. - * - * To use the base class extend it and use a setup method configure the checksum - * field. - * - */ -@State(Scope.Thread) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -public abstract class ChecksumUnalignedBenchmarks { - - private final byte[] unalignedByteArray_1k = new byte[1034]; - private final ByteBuffer unalignedWrappedByteBuffer_1k = ByteBuffer.wrap(unalignedByteArray_1k); - private final ByteBuffer unalignedDirectByteBuffer_1k = ByteBuffer.allocateDirect(unalignedByteArray_1k.length); - - @Setup - final public void setup() { - Random r = new Random(123456789L); - r.nextBytes(unalignedByteArray_1k); - unalignedDirectByteBuffer_1k.put(unalignedByteArray_1k); - } - - protected Checksum checksum; - - @Param({"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}) - private int offset; - - @Benchmark - @OperationsPerInvocation(1024) - public void byteArray_1K() { - checksum.update(unalignedByteArray_1k, offset, 1024); - } - - @Benchmark - @OperationsPerInvocation(1024) - public void wrappedByteBuffer_1K() { - unalignedWrappedByteBuffer_1k.position(offset); - unalignedWrappedByteBuffer_1k.limit(offset + 1024); - checksum.update(unalignedWrappedByteBuffer_1k); - } - - @Benchmark - @OperationsPerInvocation(1024) - public void directByteBuffer_1K() { - unalignedDirectByteBuffer_1k.position(offset); - unalignedWrappedByteBuffer_1k.limit(offset + 1024); - checksum.update(unalignedDirectByteBuffer_1k); - } -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/ZipFileDecompression.java --- a/test/micro/src/classes/org/openjdk/micro/jdk/java/util/zip/ZipFileDecompression.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,364 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.jdk.java.util.zip; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.JarURLConnection; -import java.net.URL; -import java.util.Arrays; -import java.util.Base64; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipOutputStream; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.TearDown; - -/** - * - * @author sfriberg - */ -@State(Scope.Benchmark) -public class ZipFileDecompression { - - public static enum FILES { - - small_txt, - large_txt, - very_large_txt, - small_class, - large_class, - large_bin, - stored_file; - } - - @Param - private FILES compressedFile; - - private ZipFile zipFile; - - private final Map compressedFiles = new HashMap<>(); - - // Thread private reusable buffers - @State(Scope.Thread) - public static class ThreadLocalBuffers { - - final byte[] bytes = new byte[10 * 1024 * 1024]; - } - - /** - * Create ZIP file used in benchmark - * - * @throws IOException - */ - @Setup - public void setup() throws IOException { - - File file = File.createTempFile(this.getClass().getSimpleName(), ".zip"); - file.deleteOnExit(); - - try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file)); - ByteArrayOutputStream baos = new ByteArrayOutputStream(50 * text.length)) { - - // Size of entries in bytes - // small_txt csize 264 size 445 - // large_txt csize 282 size 2225 - // very_large_txt csize 399 size 22250 - // small_class csize 418 size 982 - // large_class csize 4351 size 7702 - // large_bin csize 1048896 size 1048576 - // stored_file csize 2053 size 2048 - writeBytes(zos, FILES.small_txt, text); - - for (int i = 0; i < 5; i++) { - baos.write(text); - } - writeBytes(zos, FILES.large_txt, baos.toByteArray()); - baos.reset(); - - for (int i = 0; i < 50; i++) { - baos.write(text); - } - writeBytes(zos, FILES.very_large_txt, baos.toByteArray()); - baos.reset(); - - writeBytes(zos, FILES.small_class, smallKlass); - - writeBytes(zos, FILES.large_class, largeKlass); - - byte[] largeBinBytes = new byte[1024 * 1024]; - new Random(543210).nextBytes(largeBinBytes); - writeBytes(zos, FILES.large_bin, largeBinBytes); - - // No compression on this entry - zos.setLevel(ZipOutputStream.STORED); - byte[] storedBytes = new byte[2 * 1024]; - new Random(543210).nextBytes(storedBytes); - writeBytes(zos, FILES.stored_file, storedBytes); - } - - zipFile = new ZipFile(file); - - verifyZipFile(); - } - - private void writeBytes(ZipOutputStream zos, FILES file, byte[] bytes) throws IOException { - compressedFiles.put(file, bytes); // Save for verification - zos.putNextEntry(new ZipEntry(file.name())); - zos.write(bytes); - zos.closeEntry(); - } - - @TearDown - public void teardown() throws IOException { - verifyZipFile(); - zipFile.close(); - } - - private void verifyZipFile() { - Enumeration entries = zipFile.entries(); - int count = 0; - while (entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - - try { - FILES filename = FILES.valueOf(entry.getName()); - byte[] extractedFile = new byte[(int) entry.getSize()]; - readFully(zipFile.getInputStream(entry), entry.getSize(), extractedFile); - if (!Arrays.equals(compressedFiles.get(filename), extractedFile)) { - throw new IllegalStateException("Uncompressed file differs from file that was compressed file " + entry.getName()); - } - } catch (IOException ex) { - throw new IllegalStateException("Error reading Zip " + zipFile.getName()); - } catch (IllegalArgumentException ex) { - throw new IllegalStateException("Generated ZIP should not contain " + entry.getName()); - } - count++; - } - if (count != FILES.values().length) { - throw new IllegalStateException("Generated ZIP file does not contain all expected files"); - } - } - - @Benchmark - public void zipEntryInputStream(ThreadLocalBuffers tbb) throws IOException { - ZipEntry entry = zipFile.getEntry(compressedFile.name()); - readFully(zipFile.getInputStream(entry), entry.getSize(), tbb.bytes); - } - - @Benchmark - public void jarURLEntryInputStream(ThreadLocalBuffers tbb) throws IOException { - URL url = new URL("jar:file:" + zipFile.getName() + "!/" + compressedFile.name()); - JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); - readFully(jarConnection.getInputStream(), jarConnection.getContentLengthLong(), tbb.bytes); - } - - private int readFully(InputStream stream, long len, byte[] bytes) throws IOException { - if (len > bytes.length) { - throw new IllegalStateException("byte[] too small to read stream"); - } - int nread = 0, n = 0; - while (nread < len && (n = stream.read(bytes, nread, bytes.length - nread)) > 0) { - nread += n; - } - return nread; - } - - // Data for ZIP file creation - private final byte[] text - = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " - + "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis " - + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " - + "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore " - + "eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt " - + "in culpa qui officia deserunt mollit anim id est laborum.").getBytes(); - private final byte[] smallKlass = Base64.getDecoder().decode( - "yv66vgAAADQAJgcAIgcAIwcAJAEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgEACVNpZ25h" - + "dHVyZQEABihURTspWgEABW9mZmVyAQADcHV0AQAVKExqYXZhL2xhbmcvT2JqZWN0OylWAQAKRXhj" - + "ZXB0aW9ucwcAJQEABihURTspVgEANShMamF2YS9sYW5nL09iamVjdDtKTGphdmEvdXRpbC9jb25j" - + "dXJyZW50L1RpbWVVbml0OylaAQAmKFRFO0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7" - + "KVoBAAR0YWtlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAUoKVRFOwEABHBvbGwBADQoSkxqYXZh" - + "L3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvbGFuZy9PYmplY3Q7AQAlKEpMamF2YS91" - + "dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOwEAEXJlbWFpbmluZ0NhcGFjaXR5AQADKClJAQAG" - + "cmVtb3ZlAQAIY29udGFpbnMBAAdkcmFpblRvAQAZKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspSQEA" - + "HyhMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47KUkBABooTGphdmEvdXRpbC9Db2xsZWN0aW9u" - + "O0kpSQEAIChMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47SSlJAQA+PEU6TGphdmEvbGFuZy9P" - + "YmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvUXVldWU8VEU7PjsBAApTb3VyY2VG" - + "aWxlAQASQmxvY2tpbmdRdWV1ZS5qYXZhAQAiamF2YS91dGlsL2NvbmN1cnJlbnQvQmxvY2tpbmdR" - + "dWV1ZQEAEGphdmEvbGFuZy9PYmplY3QBAA9qYXZhL3V0aWwvUXVldWUBAB5qYXZhL2xhbmcvSW50" - + "ZXJydXB0ZWRFeGNlcHRpb24GAQABAAIAAQADAAAACwQBAAQABQABAAYAAAACAAcEAQAIAAUAAQAG" - + "AAAAAgAHBAEACQAKAAIACwAAAAQAAQAMAAYAAAACAA0EAQAIAA4AAgALAAAABAABAAwABgAAAAIA" - + "DwQBABAAEQACAAsAAAAEAAEADAAGAAAAAgASBAEAEwAUAAIACwAAAAQAAQAMAAYAAAACABUEAQAW" - + "ABcAAAQBABgABQAABAEAGQAFAAAEAQAaABsAAQAGAAAAAgAcBAEAGgAdAAEABgAAAAIAHgACAAYA" - + "AAACAB8AIAAAAAIAIQ=="); - private final byte[] largeKlass = Base64.getDecoder().decode( - "yv66vgAAADQBWAoAngDvBwDwCgACAPEKAAIA8gcA8woAAgD0CgACAPUKAAUA9goAAgD3A4AAAAAK" - + "AAUA+AoABQD5CgACAPoKAPsA8QoAAgD8CgAFAP0KAAUA/goABQD/Bf/////////kCgACAQAKAAIB" - + "AQoAAgECCgAFAQMKAAUBBAoAAgEFCgAFAQYKAPsBBwoA+wEICgD7AQkFAAAAAAAAAAwFAAAAAAAA" - + "AA0HAQoHAQsKACQA7wgBDAoAJAENCgAkAQ4KACQBDwoAIwEQCQAFAREKAPsA8goA+wD0CgAFARIJ" - + "AAUBEwkABQEUCgACARUKAAIBFgkABQEXCgACARgFAAAAAAAAAW0FAAAAAAAAAAQFAAAAAAAAAGQF" - + "AAAAAAAAAZAKARkBGgoBGQEbBQAAAAAAAAACCgACARwKAAIBHQoABQEeBQAAAAAAAAAfBQAAAAAA" - + "AAAcCgAFAR8JAAUBIAcBIQgBIgoASgEjCgACAQcKAAUBJAUAAAAAAAAABwoBGQElBQAAAAAAAjqx" - + "AwAAjqwKARkBJgoBGQEnCgEoASkDAAr5OwMACvqoAwAK/BUDAAr9gwMACv7wAwALAF0DAAsBygMA" - + "CwM4AwALBKUDAAsGEgMACwd/AwALCO0DAAsKWgMACwvHAwALDTQDAAsOogMACxAPAwALEXwDAAsS" - + "6QMACxRXAwALFcQDAAsXMQMACxieAwALGgwDAAsbeQMACxzmAwALHlMDAAsfwQMACyEuAwALIpsD" - + "AAskCAMACyV2AwALJuMDAAsoUAMACym9AwALKysDAAssmAMACy4FAwALL3IDAAsw4AMACzJNAwAL" - + "M7oDAAs1JwMACzaVAwALOAIDAAs5bwMACzrcAwALPEoDAAs9twMACz8kAwALQJEDAAtB/wMAC0Ns" - + "AwALRNkDAAtGRgMAC0e0AwALSSEDAAtKjgMAC0v7AwALTWkDAAtO1gMAC1BDAwALUbADAAtTHgMA" - + "C1SLAwALVfgDAAtXZQMAC1jTAwALWkADAAtbrQcBKgEABERhdGUBAAxJbm5lckNsYXNzZXMBAAdK" - + "QU5VQVJZAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAQEACEZFQlJVQVJZAwAAAAIBAAVNQVJDSAMA" - + "AAADAQAFQVBSSUwDAAAABAEAA01BWQMAAAAFAQAESlVORQMAAAAGAQAESlVMWQMAAAAHAQAGQVVH" - + "VVNUAwAAAAgBAAlTRVBURU1CRVIDAAAACQEAB09DVE9CRVIDAAAACgEACE5PVkVNQkVSAwAAAAsB" - + "AAhERUNFTUJFUgMAAAAMAQAGU1VOREFZAQAGTU9OREFZAQAHVFVFU0RBWQEACVdFRE5FU0RBWQEA" - + "CFRIVVJTREFZAQAGRlJJREFZAQAIU0FUVVJEQVkBAAlCQVNFX1lFQVIDAAAHsgEAC0ZJWEVEX0RB" - + "VEVTAQACW0kBAA1EQVlTX0lOX01PTlRIAQAZQUNDVU1VTEFURURfREFZU19JTl9NT05USAEAHkFD" - + "Q1VNVUxBVEVEX0RBWVNfSU5fTU9OVEhfTEVBUAEAEyRhc3NlcnRpb25zRGlzYWJsZWQBAAFaAQAG" - + "PGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACHZhbGlkYXRlAQAjKExzdW4v" - + "dXRpbC9jYWxlbmRhci9DYWxlbmRhckRhdGU7KVoBAA1TdGFja01hcFRhYmxlBwDwAQAJbm9ybWFs" - + "aXplBwErBwDzBwEsAQAObm9ybWFsaXplTW9udGgBACMoTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVu" - + "ZGFyRGF0ZTspVgEADWdldFllYXJMZW5ndGgBACMoTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVuZGFy" - + "RGF0ZTspSQEAFWdldFllYXJMZW5ndGhJbk1vbnRocwEADmdldE1vbnRoTGVuZ3RoAQAFKElJKUkB" - + "AAxnZXREYXlPZlllYXIBACMoTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVuZGFyRGF0ZTspSgEABihJ" - + "SUkpSgEADGdldEZpeGVkRGF0ZQEAKyhJSUlMc3VuL3V0aWwvY2FsZW5kYXIvQmFzZUNhbGVuZGFy" - + "JERhdGU7KUoBABxnZXRDYWxlbmRhckRhdGVGcm9tRml4ZWREYXRlAQAkKExzdW4vdXRpbC9jYWxl" - + "bmRhci9DYWxlbmRhckRhdGU7SilWAQAMZ2V0RGF5T2ZXZWVrAQAZZ2V0RGF5T2ZXZWVrRnJvbUZp" - + "eGVkRGF0ZQEABChKKUkBABRnZXRZZWFyRnJvbUZpeGVkRGF0ZQEAHWdldEdyZWdvcmlhblllYXJG" - + "cm9tRml4ZWREYXRlAQAKaXNMZWFwWWVhcgEABChJKVoBAAg8Y2xpbml0PgEAClNvdXJjZUZpbGUB" - + "ABFCYXNlQ2FsZW5kYXIuamF2YQwAywDMAQAjc3VuL3V0aWwvY2FsZW5kYXIvQmFzZUNhbGVuZGFy" - + "JERhdGUMAS0BLgwBLwEwAQAec3VuL3V0aWwvY2FsZW5kYXIvQmFzZUNhbGVuZGFyDAExATAMATIB" - + "MAwA3ADdDADlATAMAOUA2gwBMwDQDAE0ATUHASwMATYBNwwBOADfDAE5ANoMANcA2AwBOgE7DAE8" - + "AT0MAT4BOwwA4QDiDADjAOQMAT8BPQwA6gDrDAFAATUMAUEBPQwBQgE9AQAiamF2YS9sYW5nL0ls" - + "bGVnYWxBcmd1bWVudEV4Y2VwdGlvbgEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyAQAVSWxsZWdh" - + "bCBtb250aCB2YWx1ZTogDAFDAUQMAUMBRQwBRgFHDADLAUgMAMYAxQwA3gDgDADIAMUMAMcAxQwB" - + "SQDrDAFKAUsMAMQAxQwBTAFNBwFODAFPAVAMAU8A3QwBSQFRDAFSATAMAOkA5wwA5gDnDADJAMoB" - + "ABhqYXZhL2xhbmcvQXNzZXJ0aW9uRXJyb3IBABVuZWdhdGl2ZSBkYXkgb2Ygd2VlayAMAMsBUwwA" - + "4QDfDAFUAVAMAVQA3QwBVQDrBwFWDAFXAS4BACJzdW4vdXRpbC9jYWxlbmRhci9BYnN0cmFjdENh" - + "bGVuZGFyAQASamF2YS91dGlsL1RpbWVab25lAQAec3VuL3V0aWwvY2FsZW5kYXIvQ2FsZW5kYXJE" - + "YXRlAQAMaXNOb3JtYWxpemVkAQADKClaAQAIZ2V0TW9udGgBAAMoKUkBAA1nZXREYXlPZk1vbnRo" - + "AQARZ2V0Tm9ybWFsaXplZFllYXIBAAx2YWxpZGF0ZVRpbWUBAA1zZXROb3JtYWxpemVkAQAEKFop" - + "VgEAB2dldFpvbmUBABYoKUxqYXZhL3V0aWwvVGltZVpvbmU7AQAHZ2V0VGltZQEADW5vcm1hbGl6" - + "ZVRpbWUBAA1zZXREYXlPZk1vbnRoAQAjKEkpTHN1bi91dGlsL2NhbGVuZGFyL0NhbGVuZGFyRGF0" - + "ZTsBABFzZXROb3JtYWxpemVkWWVhcgEABChJKVYBAAhzZXRNb250aAEADHNldERheU9mV2VlawEA" - + "C3NldExlYXBZZWFyAQANc2V0Wm9uZU9mZnNldAEAEXNldERheWxpZ2h0U2F2aW5nAQAGYXBwZW5k" - + "AQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAcKEkpTGph" - + "dmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsB" - + "ABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAANoaXQBAA1nZXRDYWNoZWRKYW4xAQADKClKAQAIc2V0" - + "Q2FjaGUBAAYoSUpJKVYBAB9zdW4vdXRpbC9jYWxlbmRhci9DYWxlbmRhclV0aWxzAQALZmxvb3JE" - + "aXZpZGUBAAUoSkopSgEABChKKVoBAA1nZXRDYWNoZWRZZWFyAQAVKExqYXZhL2xhbmcvT2JqZWN0" - + "OylWAQADbW9kAQATaXNHcmVnb3JpYW5MZWFwWWVhcgEAD2phdmEvbGFuZy9DbGFzcwEAFmRlc2ly" - + "ZWRBc3NlcnRpb25TdGF0dXMEIQAFAJ4AAAAZABkAoQCiAAEAowAAAAIApAAZAKUAogABAKMAAAAC" - + "AKYAGQCnAKIAAQCjAAAAAgCoABkAqQCiAAEAowAAAAIAqgAZAKsAogABAKMAAAACAKwAGQCtAKIA" - + "AQCjAAAAAgCuABkArwCiAAEAowAAAAIAsAAZALEAogABAKMAAAACALIAGQCzAKIAAQCjAAAAAgC0" - + "ABkAtQCiAAEAowAAAAIAtgAZALcAogABAKMAAAACALgAGQC5AKIAAQCjAAAAAgC6ABkAuwCiAAEA" - + "owAAAAIApAAZALwAogABAKMAAAACAKYAGQC9AKIAAQCjAAAAAgCoABkAvgCiAAEAowAAAAIAqgAZ" - + "AL8AogABAKMAAAACAKwAGQDAAKIAAQCjAAAAAgCuABkAwQCiAAEAowAAAAIAsAAaAMIAogABAKMA" - + "AAACAMMAGgDEAMUAAAAYAMYAxQAAABgAxwDFAAAAGADIAMUAABAYAMkAygAAABQAAQDLAMwAAQDN" - + "AAAAIQABAAEAAAAFKrcAAbEAAAABAM4AAAAKAAIAAAAnAAQAjwABAM8A0AABAM0AAADWAAQABgAA" - + "AGUrwAACTSy2AAOZAAUErCy2AAQ+HQShAAkdEAykAAUDrCy2AAY2BBUEngARFQQqLLYABx23AAik" - + "AAUDrCy2AAk2BRUFEgqfAA8VBSostgALnwAFA6wqK7YADJoABQOsLAS2AA0ErAAAAAIAzgAAAEIA" - + "EAAAAMAABQDBAAwAwgAOAMQAEwDFAB4AxgAgAMgAJgDJADkAygA7AMwAQQDNAFIAzgBUANEAXADS" - + "AF4A1QBjANYA0QAAABcAB/wADgcA0vwADwEB/AAYAQH8ABgBCQABANMA0AABAM0AAAIJAAcADAAA" - + "ASkrtgAOmQAFBKwrwAACTSy2AA9OLcYACyortgAQWASsKiy2ABE2BCostgASLLYABoUVBIVhNwUs" - + "tgAENgcstgAHNggqFQgVB7cACDYJFgUJlJ4ADBYFFQmFlJ4AqhYFCZSdAEQWBRQAE5SeADsqFQiE" - + "B/8VB7cACDYJFgUVCYVhNwUsFgWItgAVVxUHmgAPEAw2BywVCARktgAWLBUHtgAXV6cAaxYFFQmF" - + "lJ4APhYFFQkQHGCFlJwAMhYFFQmFZTcFhAcBLBYFiLYAFVcVBxAMpAAOLBUIBGC2ABYENgcsFQe2" - + "ABdXpwAnFgUqFQgVBwQstgAYYQplNwoqLBYKtgAZpwAMLCostgALtgAaKyostgAHtgAbtgAcKwO2" - + "AB0rA7YAHiwEtgANBKwAAAACAM4AAACeACcAAADaAAcA2wAJAN4ADgDfABMA4wAXAOQAHQDlAB8A" - + "6AAmAOkAKwDqADYA6wA8AOwAQgDtAEwA7wBcAPAAbADxAHkA8gCBAPMAiQD0AI4A9QCSAPYAmgD4" - + "AKQA+QC5APoAwQD7AMQA/ADMAP0A0wD+ANsA/wDeAQEA6AEDAPkBBAEAAQUBAwEHAQwBCQEYAQoB" - + "HQELASIBDAEnAQ0A0QAAACoACQn9ABUHANIHANT/ADwACQcA1QcA1gcA0gcA1AEEAQEBAAA9CTkJ" - + "GggAAADXANgAAQDNAAAA1gAGAAgAAAB1K8AAAk0stgAHPiy2AASFNwQWBAmUnQAxChYEZTcGHRYG" - + "FAAfbQphiGQ+FAAhFgYUAB9xZTcELB22ABYsFgSItgAXV6cAMRYEFAAflJ4AKB0WBAplFAAfbYhg" - + "PhYECmUUAB9xCmE3BCwdtgAWLBYEiLYAF1exAAAAAgDOAAAAPgAPAAABEQAFARIACgETABEBFAAY" - + "ARUAHgEWACoBFwA2ARgAOwEZAEMBGgBPARsAWwEcAGcBHQBsAR4AdAEgANEAAAALAAL+AEYHANIB" - + "BC0AAQDZANoAAQDNAAAAOwACAAIAAAAYKivAAAK2AAe2ABuZAAkRAW6nAAYRAW2sAAAAAgDOAAAA" - + "BgABAAABLwDRAAAABQACFEIBAAEA2wDaAAEAzQAAABsAAQACAAAAAxAMrAAAAAEAzgAAAAYAAQAA" - + "ATMAAQDcANoAAQDNAAAAcgAEAAQAAAA6K8AAAk0stgAEPh0EoQAJHRAMpAAeuwAjWbsAJFm3ACUS" - + "JrYAJx22ACi2ACm3ACq/Kiy2AAcdtwAIrAAAAAIAzgAAABYABQAAAUIABQFDAAoBRAAVAUUAMAFH" - + "ANEAAAAKAAL9ABUHANIBGgACANwA3QABAM0AAABIAAIABAAAABiyACscLj4cBaAADiobtgAbmQAG" - + "hAMBHawAAAACAM4AAAASAAQAAAFMAAYBTQATAU4AFgFQANEAAAAGAAH8ABYBAAEA3gDfAAEAzQAA" - + "ADgABAACAAAAFCorwAACtgAHK7YALCu2AC22AC6tAAAAAQDOAAAAEgAEAAABVAAJAVUADQFWABAB" - + "VAAQAN4A4AABAM0AAABPAAQABAAAABodhSobtgAbmQALsgAvHC6nAAiyADAcLoVhrQAAAAIAzgAA" - + "AAoAAgAAAVoABAFbANEAAAATAAJSBP8ABAAEBwDVAQEBAAIEAQABAOEA3wABAM0AAABZAAUAAgAA" - + "ACQrtgAOmgAIKiu2ABIqK8AAArYAByu2ACwrtgAtK8AAArYAGK0AAAACAM4AAAAaAAYAAAFhAAcB" - + "YgAMAWQAFQFlABkBZgAgAWQA0QAAAAMAAQwAAQDhAOIAAQDNAAACVwAIAAsAAAFEHASgAAwdBKAA" - + "BwSnAAQDNgUZBMYAJxkEG7YAMZkAHhUFmQAJGQS2ADKtGQS2ADIqGxwdtgAuYQplrRsRB7JkNgYV" - + "BpsAShUGsgAzvqIAQbIAMxUGLoU3BxkExgAcGQQbFgcqG7YAG5kACREBbqcABhEBbbYANBUFmQAI" - + "FgenAA8WByobHB22AC5hCmWtG4UKZTcHHYU3CRYHCZSbADQWCRQANRYHaRYHFAA3bWEWBxQAOW1l" - + "FgcUADttYREBbxxoEQFqZBAMbIVhYTcJpwA5FgkUADUWB2kWBxQAN7gAPWEWBxQAObgAPWUWBxQA" - + "O7gAPWERAW8caBEBamQQDLgAPoVhYTcJHAWkABcWCSobtgAbmQAHCqcABhQAP2U3CRkExgAhFQWZ" - + "ABwZBBsWCSobtgAbmQAJEQFupwAGEQFttgA0FgmtAAAAAgDOAAAAZgAZAAABbAARAW8AHwFwACQB" - + "cQAqAXMAOgF3AEEBeABPAXkAWAF6AF0BewB2AX0AjQGAAJMBgQCXAYMAngGEAM8BigDcAYsA5QGM" - + "AO4BjQD9AY4BBQGRAQoBkgEeAZYBKAGXAUEBmgDRAAAAlQASDkAB/AAaAQ//ADUACAcA1QEBAQcA" - + "0gEBBAADBwDSAQT/AAIACAcA1QEBAQcA0gEBBAAEBwDSAQQBAglLBPoAAP0AQQQENVIE/wACAAkH" - + "ANUBAQEHANIBAQQEAAIEBAL/ABwACQcA1QEBAQcA0gEBBAQAAwcA0gEE/wACAAkHANUBAQEHANIB" - + "AQQEAAQHANIBBAECAAEA4wDkAAEAzQAAAjUABQARAAABMSvAAAI6BBkEILYAQZkAHBkEtgBCNgUZ" - + "BLYAMjcGKhUFtgAbNginADQqILYAQzYFKhUFBAQBtgAYNwYqFQW2ABs2CBkEFQUWBhUImQAJEQFu" - + "pwAGEQFttgA0IBYGZYg2CRYGFABEYRQARmE3ChUImQAJFgoKYTcKIBYKlJsAEhUJFQiZAAcEpwAE" - + "BWA2CRAMFQloEQF1YDYMFQyeAA4VDBEBb2w2DKcADRUMEQFvuAA+NgwWBrIAMBUMLoVhNw0VCJkA" - + "DxUMBqEACRYNCmE3DSAWDWWIBGA2DyC4AEg2ELIASZoAJBUQnQAfuwBKWbsAJFm3ACUSS7YAJxUQ" - + "tgAotgAptwBMvxkEFQW2ABYZBBUMtgAXVxkEFQ+2ABVXGQQVELYAGhkEFQi2AE0ZBAS2AA2xAAAA" - + "AgDOAAAAggAgAAABpAAGAagADwGpABYBqgAdAasAKAGwAC8BsQA6AbIAQgG0AFkBtwBgAbgAbAG5" - + "AHEBugB3AbwAfgG9AI0BvwCYAcAAnQHBAKgBwwCyAcUAvgHGAMkBxwDPAckA2AHKAN4BywEFAcwB" - + "DAHNARQBzgEcAc8BIwHQASoB0QEwAdIA0QAAAGoADPwAKAcA0v8AKgAHBwDVBwDWBAcA0gEEAQAD" - + "BwDSAQT/AAIABwcA1QcA1gQHANIBBAEABAcA0gEEAQL9AB0BBFEB/wAAAAkHANUHANYEBwDSAQQB" - + "AQQAAgEBAvwAGgEJ/AAcBP0ANQEBAAEA5QDaAAEAzQAAACcAAgAEAAAACyortgBOQSC4AEisAAAA" - + "AQDOAAAACgACAAAB2AAGAdkAGQDmAOcAAQDNAAAAQwAEAAIAAAAaHgmUmwAMHhQAT3GIBGCsHhQA" - + "T7gAUYgEYKwAAAACAM4AAAAOAAMAAAHeAAYB3wAPAeEA0QAAAAMAAQ8AAQDoAOcAAQDNAAAAHgAD" - + "AAMAAAAGKh+2AEOsAAAAAQDOAAAABgABAAAB5QAQAOkA5wABAM0AAAFcAAQADgAAAMkfCZSeAEof" - + "CmVCIRQAUm2INgkhFABScYg2BRUFElRsNgoVBRJUcDYGFQYRBbVsNgsVBhEFtXA2BxUHEQFtbDYM" - + "FQcRAW1wBGA2CKcAVx8KZUIhFABSuAA9iDYJIRQAUrgAUYg2BRUFElS4AD42ChUFElS4AFU2BhUG" - + "EQW1uAA+NgsVBhEFtbgAVTYHFQcRAW24AD42DBUHEQFtuABVBGA2CBEBkBUJaBBkFQpoYAcVC2hg" - + "FQxgNg0VCgefAAwVDAefAAaEDQEVDawAAAACAM4AAABeABcAAAHxAAYB8gAKAfMAEgH0ABoB9QAh" - + "AfYAKAH3ADAB+AA4AfkAQAH6AE0B/ABRAf0AWwH+AGUB/wBuAgAAdwIBAIECAgCLAgMAlQIEAKEC" - + "BgC3AgcAwwIIAMYCCgDRAAAAHQAD+wBN/wBTAAsHANUEBAEBAQEBAQEBAAD8ACQBAAQA6gDQAAEA" - + "zQAAACQAAgACAAAADCorwAACtgAHtgAbrAAAAAEAzgAAAAYAAQAAAhMAAADqAOsAAQDNAAAAHQAB" - + "AAIAAAAFG7gAVqwAAAABAM4AAAAGAAEAAAIXAAgA7ADMAAEAzQAAAuIABAAAAAACrxIFtgBXmgAH" - + "BKcABAOzAEkQRrwKWQMSWE9ZBBJZT1kFElpPWQYSW09ZBxJcT1kIEl1PWRAGEl5PWRAHEl9PWRAI" - + "EmBPWRAJEmFPWRAKEmJPWRALEmNPWRAMEmRPWRANEmVPWRAOEmZPWRAPEmdPWRAQEmhPWRAREmlP" - + "WRASEmpPWRATEmtPWRAUEmxPWRAVEm1PWRAWEm5PWRAXEm9PWRAYEnBPWRAZEnFPWRAaEnJPWRAb" - + "EnNPWRAcEnRPWRAdEnVPWRAeEnZPWRAfEndPWRAgEnhPWRAhEnlPWRAiEnpPWRAjEntPWRAkEnxP" - + "WRAlEn1PWRAmEn5PWRAnEn9PWRAoEoBPWRApEoFPWRAqEoJPWRArEoNPWRAsEoRPWRAtEoVPWRAu" - + "EoZPWRAvEodPWRAwEohPWRAxEolPWRAyEopPWRAzEotPWRA0EoxPWRA1Eo1PWRA2Eo5PWRA3Eo9P" - + "WRA4EpBPWRA5EpFPWRA6EpJPWRA7EpNPWRA8EpRPWRA9EpVPWRA+EpZPWRA/EpdPWRBAEphPWRBB" - + "EplPWRBCEppPWRBDEptPWRBEEpxPWRBFEp1PswAzEA28ClkDEB9PWQQQH09ZBRAcT1kGEB9PWQcQ" - + "Hk9ZCBAfT1kQBhAeT1kQBxAfT1kQCBAfT1kQCRAeT1kQChAfT1kQCxAeT1kQDBAfT7MAKxANvApZ" - + "AxDiT1kEA09ZBRAfT1kGEDtPWQcQWk9ZCBB4T1kQBhEAl09ZEAcRALVPWRAIEQDUT1kQCREA809Z" - + "EAoRARFPWRALEQEwT1kQDBEBTk+zADAQDbwKWQMQ4k9ZBANPWQUQH09ZBhA8T1kHEFtPWQgQeU9Z" - + "EAYRAJhPWRAHEQC2T1kQCBEA1U9ZEAkRAPRPWRAKEQEST1kQCxEBMU9ZEAwRAU9PswAvsQAAAAIA" - + "zgAAABYABQAAACcAEABGAbUBNgIEATkCWQE9ANEAAAAFAAIMQAEAAgDtAAAAAgDuAKAAAAAKAAEA" - + "AgAFAJ8ECQ=="); -} diff -r 7cf3051d8572 -r 013359fdfeb2 test/micro/src/classes/org/openjdk/micro/util/SecurityManagerHelper.java --- a/test/micro/src/classes/org/openjdk/micro/util/SecurityManagerHelper.java Fri Sep 28 15:32:29 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.micro.util; - -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.net.URI; -import java.security.NoSuchAlgorithmException; -import java.security.Permission; -import java.security.Policy; -import java.security.URIParameter; - -/** - * Help class to create and load Security Policy file from a set of Permissions - */ -public class SecurityManagerHelper { - - /** - * Create and load a security manager using the provided permissions. - * - * @param perms Permissions to add to the file - * - * @throws IOException If file could not be created or written to. - * @throws NoSuchAlgorithmException if no Provider supports a PolicySpi - * implementation for the specified type. - */ - public static void setupSecurityManager(Permission... perms) - throws IOException, NoSuchAlgorithmException { - - URI policyURI = createSecurityFile(perms); - Policy.setPolicy(Policy.getInstance("JavaPolicy", new URIParameter(policyURI))); - System.setSecurityManager(new SecurityManager()); - } - - private static URI createSecurityFile(Permission... perms) throws IOException { - - File policyFile = File.createTempFile("security", ".policy"); - policyFile.deleteOnExit(); - - try (PrintStream writer = new PrintStream(policyFile)) { - writer.println("grant {"); - for (Permission p : perms) { - appendPermission(writer, p); - } - // Permissions required by JMH - appendPermission(writer, new RuntimePermission("modifyThread")); - // Required when running without forking -// appendPermission(writer, new RuntimePermission("accessDeclaredMembers")); -// appendPermission(writer, new RuntimePermission("createSecurityManager")); -// appendPermission(writer, new ReflectPermission("suppressAccessChecks")); -// appendPermission(writer, new ManagementPermission("monitor")); -// appendPermission(writer, new PropertyPermission("jmh.scorePrecision", "read")); - writer.println("};"); - } - - return policyFile.toURI(); - } - - private static void appendPermission(PrintStream writer, Permission p) { - writer.printf("\tpermission %s \"%s\", \"%s\";\n", - p.getClass().getName(), p.getName(), p.getActions()); - } -}