/*
* Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package benchmarks.regression;
import com.google.caliper.Runner;
import com.google.caliper.SimpleBenchmark;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AnnotatedElementBenchmark extends SimpleBenchmark {
private Class<?> type;
private Field field;
private Method method;
@Override protected void setUp() throws Exception {
type = Type.class;
field = Type.class.getField("field");
method = Type.class.getMethod("method", String.class);
}
// get annotations by member type and method
public void timeGetTypeAnnotations(int reps) {
for (int i = 0; i < reps; i++) {
type.getAnnotations();
}
}
public void timeGetFieldAnnotations(int reps) {
for (int i = 0; i < reps; i++) {
field.getAnnotations();
}
}
public void timeGetMethodAnnotations(int reps) {
for (int i = 0; i < reps; i++) {
method.getAnnotations();
}
}
public void timeGetParameterAnnotations(int reps) {
for (int i = 0; i < reps; i++) {
method.getParameterAnnotations();
}
}
public void timeGetTypeAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
type.getAnnotation(Marker.class);
}
}
public void timeGetFieldAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
field.getAnnotation(Marker.class);
}
}
public void timeGetMethodAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
method.getAnnotation(Marker.class);
}
}
public void timeIsTypeAnnotationPresent(int reps) {
for (int i = 0; i < reps; i++) {
type.isAnnotationPresent(Marker.class);
}
}
public void timeIsFieldAnnotationPresent(int reps) {
for (int i = 0; i < reps; i++) {
field.isAnnotationPresent(Marker.class);
}
}
public void timeIsMethodAnnotationPresent(int reps) {
for (int i = 0; i < reps; i++) {
method.isAnnotationPresent(Marker.class);
}
}
// get annotations by result size
public void timeGetAllReturnsLargeAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
HasLargeAnnotation.class.getAnnotations();
}
}
public void timeGetAllReturnsSmallAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
HasSmallAnnotation.class.getAnnotations();
}
}
public void timeGetAllReturnsMarkerAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
HasMarkerAnnotation.class.getAnnotations();
}
}
public void timeGetAllReturnsNoAnnotation(int reps) {
for (int i = 0; i < reps; i++) {
HasNoAnnotations.class.getAnnotations();
}
}
public void timeGetAllReturnsThreeAnnotations(int reps) {
for (int i = 0; i < reps; i++) {
HasThreeAnnotations.class.getAnnotations();
}
}
// get annotations with inheritance
public void timeGetAnnotationsOnSubclass(int reps) {
for (int i = 0; i < reps; i++) {
ExtendsHasThreeAnnotations.class.getAnnotations();
}
}
public void timeGetDeclaredAnnotationsOnSubclass(int reps) {
for (int i = 0; i < reps; i++) {
ExtendsHasThreeAnnotations.class.getAnnotations();
}
}
// the annotated elements
@Marker
public class Type {
@Marker public String field;
@Marker public void method(@Marker String parameter) {}
}
@Large(a = "on class", b = {"A", "B", "C" },
c = @Small(e="E1", f=1695938256, g=7264081114510713000L),
d = { @Small(e="E2", f=1695938256, g=7264081114510713000L) })
public class HasLargeAnnotation {}
@Small(e="E1", f=1695938256, g=7264081114510713000L)
public class HasSmallAnnotation {}
@Marker
public class HasMarkerAnnotation {}
public class HasNoAnnotations {}
@Large(a = "on class", b = {"A", "B", "C" },
c = @Small(e="E1", f=1695938256, g=7264081114510713000L),
d = { @Small(e="E2", f=1695938256, g=7264081114510713000L) })
@Small(e="E1", f=1695938256, g=7264081114510713000L)
@Marker
public class HasThreeAnnotations {}
public class ExtendsHasThreeAnnotations {}
// the annotations
@Retention(RetentionPolicy.RUNTIME)
public @interface Marker {}
@Retention(RetentionPolicy.RUNTIME)
public @interface Large {
String a() default "";
String[] b() default {};
Small c() default @Small;
Small[] d() default {};
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Small {
String e() default "";
int f() default 0;
long g() default 0L;
}
public static void main(String[] args) throws Exception {
Runner.main(AnnotatedElementBenchmark.class, args);
}
}