• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package benchmarks.regression;
18 
19 import com.google.caliper.BeforeExperiment;
20 import java.lang.annotation.Retention;
21 import java.lang.annotation.RetentionPolicy;
22 import java.lang.reflect.Field;
23 import java.lang.reflect.Method;
24 
25 public class AnnotatedElementBenchmark {
26 
27     private Class<?> type;
28     private Field field;
29     private Method method;
30 
31     @BeforeExperiment
setUp()32     protected void setUp() throws Exception {
33         type = Type.class;
34         field = Type.class.getField("field");
35         method = Type.class.getMethod("method", String.class);
36     }
37 
38 
39     // get annotations by member type and method
40 
timeGetTypeAnnotations(int reps)41     public void timeGetTypeAnnotations(int reps) {
42         for (int i = 0; i < reps; i++) {
43             type.getAnnotations();
44         }
45     }
46 
timeGetFieldAnnotations(int reps)47     public void timeGetFieldAnnotations(int reps) {
48         for (int i = 0; i < reps; i++) {
49             field.getAnnotations();
50         }
51     }
52 
timeGetMethodAnnotations(int reps)53     public void timeGetMethodAnnotations(int reps) {
54         for (int i = 0; i < reps; i++) {
55             method.getAnnotations();
56         }
57     }
58 
timeGetParameterAnnotations(int reps)59     public void timeGetParameterAnnotations(int reps) {
60         for (int i = 0; i < reps; i++) {
61             method.getParameterAnnotations();
62         }
63     }
64 
timeGetTypeAnnotation(int reps)65     public void timeGetTypeAnnotation(int reps) {
66         for (int i = 0; i < reps; i++) {
67             type.getAnnotation(Marker.class);
68         }
69     }
70 
timeGetFieldAnnotation(int reps)71     public void timeGetFieldAnnotation(int reps) {
72         for (int i = 0; i < reps; i++) {
73             field.getAnnotation(Marker.class);
74         }
75     }
76 
timeGetMethodAnnotation(int reps)77     public void timeGetMethodAnnotation(int reps) {
78         for (int i = 0; i < reps; i++) {
79             method.getAnnotation(Marker.class);
80         }
81     }
82 
timeIsTypeAnnotationPresent(int reps)83     public void timeIsTypeAnnotationPresent(int reps) {
84         for (int i = 0; i < reps; i++) {
85             type.isAnnotationPresent(Marker.class);
86         }
87     }
88 
timeIsFieldAnnotationPresent(int reps)89     public void timeIsFieldAnnotationPresent(int reps) {
90         for (int i = 0; i < reps; i++) {
91             field.isAnnotationPresent(Marker.class);
92         }
93     }
94 
timeIsMethodAnnotationPresent(int reps)95     public void timeIsMethodAnnotationPresent(int reps) {
96         for (int i = 0; i < reps; i++) {
97             method.isAnnotationPresent(Marker.class);
98         }
99     }
100 
101     // get annotations by result size
102 
timeGetAllReturnsLargeAnnotation(int reps)103     public void timeGetAllReturnsLargeAnnotation(int reps) {
104         for (int i = 0; i < reps; i++) {
105             HasLargeAnnotation.class.getAnnotations();
106         }
107     }
108 
timeGetAllReturnsSmallAnnotation(int reps)109     public void timeGetAllReturnsSmallAnnotation(int reps) {
110         for (int i = 0; i < reps; i++) {
111             HasSmallAnnotation.class.getAnnotations();
112         }
113     }
114 
timeGetAllReturnsMarkerAnnotation(int reps)115     public void timeGetAllReturnsMarkerAnnotation(int reps) {
116         for (int i = 0; i < reps; i++) {
117             HasMarkerAnnotation.class.getAnnotations();
118         }
119     }
120 
timeGetAllReturnsNoAnnotation(int reps)121     public void timeGetAllReturnsNoAnnotation(int reps) {
122         for (int i = 0; i < reps; i++) {
123             HasNoAnnotations.class.getAnnotations();
124         }
125     }
126 
timeGetAllReturnsThreeAnnotations(int reps)127     public void timeGetAllReturnsThreeAnnotations(int reps) {
128         for (int i = 0; i < reps; i++) {
129             HasThreeAnnotations.class.getAnnotations();
130         }
131     }
132 
133 
134     // get annotations with inheritance
135 
timeGetAnnotationsOnSubclass(int reps)136     public void timeGetAnnotationsOnSubclass(int reps) {
137         for (int i = 0; i < reps; i++) {
138             ExtendsHasThreeAnnotations.class.getAnnotations();
139         }
140     }
141 
timeGetDeclaredAnnotationsOnSubclass(int reps)142     public void timeGetDeclaredAnnotationsOnSubclass(int reps) {
143         for (int i = 0; i < reps; i++) {
144             ExtendsHasThreeAnnotations.class.getDeclaredAnnotations();
145         }
146     }
147 
148 
149     // get annotations with enclosing / inner classes
150 
timeGetDeclaredClasses(int reps)151     public void timeGetDeclaredClasses(int reps) {
152         for (int i = 0; i < reps; i++) {
153             AnnotatedElementBenchmark.class.getDeclaredClasses();
154         }
155     }
156 
timeGetDeclaringClass(int reps)157     public void timeGetDeclaringClass(int reps) {
158         for (int i = 0; i < reps; i++) {
159             HasSmallAnnotation.class.getDeclaringClass();
160         }
161     }
162 
timeGetEnclosingClass(int reps)163     public void timeGetEnclosingClass(int reps) {
164         Object anonymousClass = new Object() {};
165         for (int i = 0; i < reps; i++) {
166             anonymousClass.getClass().getEnclosingClass();
167         }
168     }
169 
timeGetEnclosingConstructor(int reps)170     public void timeGetEnclosingConstructor(int reps) {
171         Object anonymousClass = new Object() {};
172         for (int i = 0; i < reps; i++) {
173             anonymousClass.getClass().getEnclosingConstructor();
174         }
175     }
176 
timeGetEnclosingMethod(int reps)177     public void timeGetEnclosingMethod(int reps) {
178         Object anonymousClass = new Object() {};
179         for (int i = 0; i < reps; i++) {
180             anonymousClass.getClass().getEnclosingMethod();
181         }
182     }
183 
timeGetModifiers(int reps)184     public void timeGetModifiers(int reps) {
185         for (int i = 0; i < reps; i++) {
186             HasSmallAnnotation.class.getModifiers();
187         }
188     }
189 
timeGetSimpleName(int reps)190     public void timeGetSimpleName(int reps) {
191         for (int i = 0; i < reps; i++) {
192             HasSmallAnnotation.class.getSimpleName();
193         }
194     }
195 
timeIsAnonymousClass(int reps)196     public void timeIsAnonymousClass(int reps) {
197         Object anonymousClass = new Object() {};
198         for (int i = 0; i < reps; i++) {
199             anonymousClass.getClass().isAnonymousClass();
200         }
201     }
202 
timeIsLocalClass(int reps)203     public void timeIsLocalClass(int reps) {
204         for (int i = 0; i < reps; i++) {
205             HasSmallAnnotation.class.isLocalClass();
206         }
207     }
208 
209 
210     // the annotated elements
211 
212     @Marker
213     public class Type {
214         @Marker public String field;
method(@arker String parameter)215         @Marker public void method(@Marker String parameter) {}
216     }
217 
218     @Large(a = "on class", b = {"A", "B", "C" },
219             c = @Small(e="E1", f=1695938256, g=7264081114510713000L),
220             d = { @Small(e="E2", f=1695938256, g=7264081114510713000L) })
221     public class HasLargeAnnotation {}
222 
223     @Small(e="E1", f=1695938256, g=7264081114510713000L)
224     public class HasSmallAnnotation {}
225 
226     @Marker
227     public class HasMarkerAnnotation {}
228 
229     public class HasNoAnnotations {}
230 
231     @Large(a = "on class", b = {"A", "B", "C" },
232             c = @Small(e="E1", f=1695938256, g=7264081114510713000L),
233             d = { @Small(e="E2", f=1695938256, g=7264081114510713000L) })
234     @Small(e="E1", f=1695938256, g=7264081114510713000L)
235     @Marker
236     public class HasThreeAnnotations {}
237 
238     public class ExtendsHasThreeAnnotations extends HasThreeAnnotations {}
239 
240 
241     // the annotations
242 
243     @Retention(RetentionPolicy.RUNTIME)
244     public @interface Marker {}
245 
246     @Retention(RetentionPolicy.RUNTIME)
247     public @interface Large {
a()248         String a() default "";
b()249         String[] b() default {};
c()250         Small c() default @Small;
d()251         Small[] d() default {};
252     }
253 
254     @Retention(RetentionPolicy.RUNTIME)
255     public @interface Small {
e()256         String e() default "";
f()257         int f() default 0;
g()258         long g() default 0L;
259     }
260 }
261