diff options
7 files changed, 193 insertions, 17 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 764b76a6..9974ce05 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: gradle:4.8-jdk8-alpine +image: gradle:4.9-jdk8-alpine variables: # Set the location of the dependency cache to a local directory, so that it diff --git a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AbstractBenchmark.java b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AbstractBenchmark.java index 2de5bcd1..3fa6f1d0 100644 --- a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AbstractBenchmark.java +++ b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AbstractBenchmark.java @@ -49,8 +49,10 @@ public abstract class AbstractBenchmark { private static final String ASM4_0 = BUILD_DIR + "asm4.0/"; private static final String ASM5_0 = BUILD_DIR + "asm5.0.1/"; private static final String ASM6_0 = BUILD_DIR + "asm6.0/"; - private static final String ASM_CORE_6_1 = "/asm/build/classes/java/main/"; - private static final String ASM_TREE_6_1 = "/asm-tree/build/classes/java/main/"; + private static final String ASM6_1 = BUILD_DIR + "asm6.1.1/"; + private static final String ASM6_2 = BUILD_DIR + "asm6.2.1/"; + private static final String ASM_CORE_CURRENT = "/asm/build/classes/java/main/"; + private static final String ASM_TREE_CURRENT = "/asm-tree/build/classes/java/main/"; private final String asmBenchmarkClass; private final String userDir; @@ -63,7 +65,9 @@ public abstract class AbstractBenchmark { V4_0, V5_0, V6_0, - V6_1; + V6_1, + V6_2, + V_CURRENT; URL[] getUrls(final String baseUrl) throws MalformedURLException { switch (this) { @@ -74,7 +78,13 @@ public abstract class AbstractBenchmark { case V6_0: return new URL[] {new URL(baseUrl + ASM6_0)}; case V6_1: - return new URL[] {new URL(baseUrl + ASM_CORE_6_1), new URL(baseUrl + ASM_TREE_6_1)}; + return new URL[] {new URL(baseUrl + ASM6_1)}; + case V6_2: + return new URL[] {new URL(baseUrl + ASM6_2)}; + case V_CURRENT: + return new URL[] { + new URL(baseUrl + ASM_CORE_CURRENT), new URL(baseUrl + ASM_TREE_CURRENT) + }; default: throw new AssertionError(); } @@ -94,8 +104,8 @@ public abstract class AbstractBenchmark { /** Creates and populates {@link #classFiles} with some class files read from disk. */ protected void prepareClasses() throws IOException { classFiles = new ArrayList<byte[]>(); - findClasses(new File(userDir + ASM_CORE_6_1), classFiles); - findClasses(new File(userDir + ASM_TREE_6_1), classFiles); + findClasses(new File(userDir + ASM_CORE_CURRENT), classFiles); + findClasses(new File(userDir + ASM_TREE_CURRENT), classFiles); } private static void findClasses(final File directory, final ArrayList<byte[]> classFiles) @@ -134,8 +144,7 @@ public abstract class AbstractBenchmark { /** * Constructs an {@link AsmBenchmarkFactory}. * - * @param asmDirectories the directories where the ASM library classes can be found. - * @param asmBenchmarkClass the class that must be instantiated by this factory. + * @param asmVersion the ASM version to use. * @throws MalformedURLException */ AsmBenchmarkFactory(final AsmVersion asmVersion) throws MalformedURLException { @@ -147,7 +156,6 @@ public abstract class AbstractBenchmark { * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException - * @throws Exception */ public Object newAsmBenchmark() throws InstantiationException, IllegalAccessException, ClassNotFoundException { diff --git a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AdapterBenchmark.java b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AdapterBenchmark.java index 8f75d1b4..1d9527f8 100644 --- a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AdapterBenchmark.java +++ b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/AdapterBenchmark.java @@ -53,6 +53,8 @@ public class AdapterBenchmark extends AbstractBenchmark { private Adapter asm5_0; private Adapter asm6_0; private Adapter asm6_1; + private Adapter asm6_2; + private Adapter asmCurrent; private Adapter aspectJBcel; private Adapter bcel; private Adapter javassist; @@ -74,6 +76,8 @@ public class AdapterBenchmark extends AbstractBenchmark { asm5_0 = (Adapter) new AsmBenchmarkFactory(AsmVersion.V5_0).newAsmBenchmark(); asm6_0 = (Adapter) new AsmBenchmarkFactory(AsmVersion.V6_0).newAsmBenchmark(); asm6_1 = (Adapter) new AsmBenchmarkFactory(AsmVersion.V6_1).newAsmBenchmark(); + asm6_2 = (Adapter) new AsmBenchmarkFactory(AsmVersion.V6_2).newAsmBenchmark(); + asmCurrent = (Adapter) new AsmBenchmarkFactory(AsmVersion.V_CURRENT).newAsmBenchmark(); aspectJBcel = new AspectJBCELAdapter(); bcel = new BCELAdapter(); javassist = new JavassistAdapter(); @@ -83,7 +87,9 @@ public class AdapterBenchmark extends AbstractBenchmark { if (!asm4_0.getVersion().equals("ASM4") || !asm5_0.getVersion().equals("ASM5") || !asm6_0.getVersion().equals("ASM6") - || !asm6_1.getVersion().equals("ASM6")) { + || !asm6_1.getVersion().equals("ASM6") + || !asm6_2.getVersion().equals("ASM6") + || !asmCurrent.getVersion().equals("ASM6")) { throw new IllegalStateException(); } @@ -119,6 +125,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void getClassInfo_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.getClassInfo(classFile)); + } + } + + @Benchmark + public void getClassInfo_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.getClassInfo(classFile)); + } + } + + @Benchmark public void getClassObjectModel_asm4_0(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(asm4_0.getClassObjectModel(classFile)); @@ -147,6 +167,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void getClassObjectModel_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.getClassObjectModel(classFile)); + } + } + + @Benchmark + public void getClassObjectModel_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.getClassObjectModel(classFile)); + } + } + + @Benchmark public void read_asm4_0(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(asm4_0.read(classFile)); @@ -175,6 +209,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void read_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.read(classFile)); + } + } + + @Benchmark + public void read_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.read(classFile)); + } + } + + @Benchmark public void readAndWrite_asm4_0(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(asm4_0.readAndWrite(classFile, /* computeMaxs = */ false)); @@ -203,6 +251,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void readAndWrite_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.readAndWrite(classFile, /* computeMaxs = */ false)); + } + } + + @Benchmark + public void readAndWrite_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.readAndWrite(classFile, /* computeMaxs = */ false)); + } + } + + @Benchmark public void readAndWrite_aspectJBcel(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(aspectJBcel.readAndWrite(classFile, /* computeMaxs = */ false)); @@ -259,6 +321,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void readAndWriteWithComputeFrames_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.readAndWriteWithComputeFrames(classFile)); + } + } + + @Benchmark + public void readAndWriteWithComputeFrames_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.readAndWriteWithComputeFrames(classFile)); + } + } + + @Benchmark public void readAndWriteWithComputeMaxs_asm4_0(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(asm4_0.readAndWrite(classFile, /* computeMaxs = */ true)); @@ -287,6 +363,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void readAndWriteWithComputeMaxs_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.readAndWrite(classFile, /* computeMaxs = */ true)); + } + } + + @Benchmark + public void readAndWriteWithComputeMaxs_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.readAndWrite(classFile, /* computeMaxs = */ true)); + } + } + + @Benchmark public void readAndWriteWithComputeMaxs_aspectJBcel(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(aspectJBcel.readAndWrite(classFile, /* computeMaxs = */ true)); @@ -336,6 +426,20 @@ public class AdapterBenchmark extends AbstractBenchmark { } @Benchmark + public void readAndWriteWithCopyPool_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.readAndWriteWithCopyPool(classFile)); + } + } + + @Benchmark + public void readAndWriteWithCopyPool_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.readAndWriteWithCopyPool(classFile)); + } + } + + @Benchmark public void readAndWriteWithObjectModel_asm4_0(final Blackhole blackhole) { for (byte[] classFile : classFiles) { blackhole.consume(asm4_0.readAndWriteWithObjectModel(classFile)); @@ -362,4 +466,18 @@ public class AdapterBenchmark extends AbstractBenchmark { blackhole.consume(asm6_1.readAndWriteWithObjectModel(classFile)); } } + + @Benchmark + public void readAndWriteWithObjectModel_asm6_2(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asm6_2.readAndWriteWithObjectModel(classFile)); + } + } + + @Benchmark + public void readAndWriteWithObjectModel_asmCurrent(final Blackhole blackhole) { + for (byte[] classFile : classFiles) { + blackhole.consume(asmCurrent.readAndWriteWithObjectModel(classFile)); + } + } } diff --git a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/GeneratorBenchmark.java b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/GeneratorBenchmark.java index 7671a586..717ecb0f 100644 --- a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/GeneratorBenchmark.java +++ b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/GeneratorBenchmark.java @@ -52,6 +52,8 @@ public class GeneratorBenchmark extends AbstractBenchmark { private Generator asm5_0; private Generator asm6_0; private Generator asm6_1; + private Generator asm6_2; + private Generator asmCurrent; private Generator aspectJBcel; private Generator bcel; private Generator cojen; @@ -76,6 +78,8 @@ public class GeneratorBenchmark extends AbstractBenchmark { asm5_0 = (Generator) new AsmBenchmarkFactory(AsmVersion.V5_0).newAsmBenchmark(); asm6_0 = (Generator) new AsmBenchmarkFactory(AsmVersion.V6_0).newAsmBenchmark(); asm6_1 = (Generator) new AsmBenchmarkFactory(AsmVersion.V6_1).newAsmBenchmark(); + asm6_2 = (Generator) new AsmBenchmarkFactory(AsmVersion.V6_2).newAsmBenchmark(); + asmCurrent = (Generator) new AsmBenchmarkFactory(AsmVersion.V_CURRENT).newAsmBenchmark(); aspectJBcel = new AspectJBCELGenerator(); bcel = new BCELGenerator(); cojen = new CojenGenerator(); @@ -89,7 +93,9 @@ public class GeneratorBenchmark extends AbstractBenchmark { if (!asm4_0.getVersion().equals("ASM4") || !asm5_0.getVersion().equals("ASM5") || !asm6_0.getVersion().equals("ASM6") - || !asm6_1.getVersion().equals("ASM6")) { + || !asm6_1.getVersion().equals("ASM6") + || !asm6_2.getVersion().equals("ASM6") + || !asmCurrent.getVersion().equals("ASM6")) { throw new IllegalStateException(); } } @@ -115,6 +121,16 @@ public class GeneratorBenchmark extends AbstractBenchmark { } @Benchmark + public byte[] asm6_2() { + return asm6_2.generateClass(); + } + + @Benchmark + public byte[] asmCurrent() { + return asmCurrent.generateClass(); + } + + @Benchmark public byte[] aspectJBcel() { return aspectJBcel.generateClass(); } diff --git a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/MemoryBenchmark.java b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/MemoryBenchmark.java index cc597b7f..c032a832 100644 --- a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/MemoryBenchmark.java +++ b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/MemoryBenchmark.java @@ -52,6 +52,8 @@ public class MemoryBenchmark extends AbstractBenchmark { private Factory asm5_0; private Factory asm6_0; private Factory asm6_1; + private Factory asm6_2; + private Factory asmCurrent; public MemoryBenchmark() { super("org.objectweb.asm.benchmarks.ASMFactory"); @@ -69,12 +71,16 @@ public class MemoryBenchmark extends AbstractBenchmark { asm5_0 = (Factory) new AsmBenchmarkFactory(AsmVersion.V5_0).newAsmBenchmark(); asm6_0 = (Factory) new AsmBenchmarkFactory(AsmVersion.V6_0).newAsmBenchmark(); asm6_1 = (Factory) new AsmBenchmarkFactory(AsmVersion.V6_1).newAsmBenchmark(); + asm6_2 = (Factory) new AsmBenchmarkFactory(AsmVersion.V6_2).newAsmBenchmark(); + asmCurrent = (Factory) new AsmBenchmarkFactory(AsmVersion.V_CURRENT).newAsmBenchmark(); // Check that the correct versions of ASM have been loaded. if (!asm4_0.getVersion().equals("ASM4") || !asm5_0.getVersion().equals("ASM5") || !asm6_0.getVersion().equals("ASM6") - || !asm6_1.getVersion().equals("ASM6")) { + || !asm6_1.getVersion().equals("ASM6") + || !asm6_2.getVersion().equals("ASM6") + || !asmCurrent.getVersion().equals("ASM6")) { throw new IllegalStateException(); } @@ -110,6 +116,20 @@ public class MemoryBenchmark extends AbstractBenchmark { } @Benchmark + public void newClass_asm6_2() { + for (byte[] classFile : classFiles) { + MemoryProfiler.keepReference(asm6_2.newClass(classFile)); + } + } + + @Benchmark + public void newClass_asmCurrent() { + for (byte[] classFile : classFiles) { + MemoryProfiler.keepReference(asmCurrent.newClass(classFile)); + } + } + + @Benchmark public void newClassNode_asm4_0() { for (byte[] classFile : classFiles) { MemoryProfiler.keepReference(asm4_0.newClassNode(classFile)); @@ -136,4 +156,18 @@ public class MemoryBenchmark extends AbstractBenchmark { MemoryProfiler.keepReference(asm6_1.newClassNode(classFile)); } } + + @Benchmark + public void newClassNode_asm6_2() { + for (byte[] classFile : classFiles) { + MemoryProfiler.keepReference(asm6_2.newClassNode(classFile)); + } + } + + @Benchmark + public void newClassNode_asmCurrent() { + for (byte[] classFile : classFiles) { + MemoryProfiler.keepReference(asmCurrent.newClassNode(classFile)); + } + } } diff --git a/build.gradle b/build.gradle index be0ca4ec..99301f1b 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ buildscript { plugins { id 'biz.aQute.bnd.builder' version '3.3.0' apply false } plugins { id 'com.github.sherter.google-java-format' version '0.7.1' apply false } -plugins { id 'me.champeau.gradle.jmh' version '0.4.5' apply false } +plugins { id 'me.champeau.gradle.jmh' version '0.4.7' apply false } plugins { id 'org.sonarqube' version '2.6.2' apply false } description = 'ASM, a very small and fast Java bytecode manipulation framework' @@ -128,7 +128,7 @@ project(':benchmarks') { 'org.javassist:javassist:3.21.0-GA', 'org.mozilla:rhino:1.7.7.1' ] - ['4.0', '5.0.1', '6.0'].each { version -> + ['4.0', '5.0.1', '6.0', '6.1.1', '6.2.1'].each { version -> configurations.create("asm${version}") dependencies.add("asm${version}", "org.ow2.asm:asm:${version}@jar") dependencies.add("asm${version}", "org.ow2.asm:asm-tree:${version}@jar") @@ -139,7 +139,7 @@ project(':benchmarks') { classes.dependsOn "asm${version}" } jmh { - jmhVersion = '1.20' + resultFormat = 'CSV' profilers = ['org.objectweb.asm.benchmarks.MemoryProfiler'] if (rootProject.hasProperty('jmhInclude')) { include = [jmhInclude] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 77371ba2..be773875 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip |