Skip to content

Commit

Permalink
Optimize annotation metadata resolution performance (micronaut-projec…
Browse files Browse the repository at this point in the history
…ts#1717)

* Optimize annotation metadata resolution performance

* Revert Optional<Class<?>> change, optimize isPresent
  • Loading branch information
graemerocher authored May 25, 2019
1 parent 345362a commit a9e5c3d
Show file tree
Hide file tree
Showing 52 changed files with 1,892 additions and 236 deletions.
21 changes: 21 additions & 0 deletions benchmarks/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
plugins {
id "me.champeau.gradle.jmh" version "0.4.8"
}

dependencies {
annotationProcessor project(":inject-java")
annotationProcessor project(":validation")
compile project(":inject")
compile project(":validation")
compile project(":runtime")


jmh 'org.openjdk.jmh:jmh-core:1.21'
jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.21'
}
jmh {
duplicateClassesStrategy = 'warn'
warmupIterations = 2
iterations = 4
fork = 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.micronaut.core.annotation;

public class AnnotationValueBenchmark {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package io.micronaut.core.convert;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.net.URI;

@State(Scope.Benchmark)
public class ConversionServiceBenchmark {

ConversionService conversionService;

@Setup
public void prepare() {
conversionService = ConversionService.SHARED;
}

@Benchmark
public void convertCacheHit() {
conversionService.convert("10", Integer.class);
}

@Benchmark
public void convertCacheMiss() {
conversionService.convert(URI.create("http://test.com"), Integer.class);
}

public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(".*" + ConversionServiceBenchmark.class.getSimpleName() + ".*")
.warmupIterations(3)
.measurementIterations(5)
.forks(1)
// .jvmArgs("-agentpath:/Applications/YourKit-Java-Profiler-2018.04.app/Contents/Resources/bin/mac/libyjpagent.jnilib")
.build();

new Runner(opt).run();
}
}
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,8 @@ subprojects { Project subproject ->

if (
!subproject.name.startsWith('test-') &&
!subproject.toString().contains('build-projects')
!subproject.toString().contains('build-projects') &&
!subproject.toString().contains('benchmarks')
) {

apply from: "${rootProject.rootDir}/gradle/publishing.gradle"
Expand Down
173 changes: 146 additions & 27 deletions core/src/main/java/io/micronaut/core/annotation/AnnotationMetadata.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,65 @@
* @since 1.0
*/
public interface AnnotationMetadataDelegate extends AnnotationMetadataProvider, AnnotationMetadata {
@Nonnull
@Override
default String[] stringValues(@Nonnull Class<? extends Annotation> annotation, @Nonnull String member) {
return getAnnotationMetadata().stringValues(annotation, member);
}

@Nonnull
@Override
default String[] stringValues(@Nonnull Class<? extends Annotation> annotation) {
return getAnnotationMetadata().stringValues(annotation, AnnotationMetadata.VALUE_MEMBER);
}

@Nonnull
@Override
default OptionalInt intValue(@Nonnull Class<? extends Annotation> annotation, @Nonnull String member) {
return getAnnotationMetadata().intValue(annotation, member);
}

@Nonnull
@Override
default OptionalInt intValue(@Nonnull Class<? extends Annotation> annotation) {
return getAnnotationMetadata().intValue(annotation);
}

@Nonnull
@Override
default Optional<String> stringValue(@Nonnull String annotation, @Nonnull String member) {
return getAnnotationMetadata().stringValue(annotation, member);
}

@Nonnull
@Override
default Optional<String> stringValue(@Nonnull Class<? extends Annotation> annotation, @Nonnull String member) {
return getAnnotationMetadata().stringValue(annotation, member);
}

@Nonnull
@Override
default Optional<String> stringValue(@Nonnull Class<? extends Annotation> annotation) {
return getAnnotationMetadata().stringValue(annotation);
}

@Nonnull
@Override
default Optional<String> stringValue(@Nonnull String annotation) {
return getAnnotationMetadata().stringValue(annotation);
}

@Nonnull
@Override
default OptionalDouble doubleValue(@Nonnull Class<? extends Annotation> annotation, @Nonnull String member) {
return getAnnotationMetadata().doubleValue(annotation, member);
}

@Nonnull
@Override
default OptionalDouble doubleValue(@Nonnull Class<? extends Annotation> annotation) {
return getAnnotationMetadata().doubleValue(annotation);
}

@Override
default @Nonnull <T> Optional<T> getValue(@Nonnull String annotation, @Nonnull Argument<T> requiredType) {
Expand Down
Loading

0 comments on commit a9e5c3d

Please sign in to comment.