1 /*
2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 package org.openjdk.bench.java.io;
24 
25 import org.openjdk.jmh.annotations.Benchmark;
26 import org.openjdk.jmh.annotations.BenchmarkMode;
27 import org.openjdk.jmh.annotations.Mode;
28 import org.openjdk.jmh.annotations.OutputTimeUnit;
29 import org.openjdk.jmh.annotations.Scope;
30 import org.openjdk.jmh.annotations.Setup;
31 import org.openjdk.jmh.annotations.State;
32 import org.openjdk.jmh.infra.Blackhole;
33 
34 import java.io.ObjectStreamClass;
35 import java.io.Serializable;
36 import java.util.LinkedList;
37 import java.util.concurrent.TimeUnit;
38 
39 /**
40  * A micro benchmark used to measure the performance impact from multi threaded access to ObjectStreamClass.
41  */
42 @BenchmarkMode(Mode.AverageTime)
43 @OutputTimeUnit(TimeUnit.NANOSECONDS)
44 @State(Scope.Thread)
45 public class ObjectStreamClasses {
46 
47     public Class<?>[] classes;
48 
49     @Setup
setup()50     public void setup() {
51         LinkedList<Class> queue = new LinkedList<Class>();
52         int i = 0;
53         while (true) {
54             // Loop until we get a ClassNotFoundException
55             // Maybe rewrite this considering the fact that there are 29
56             // inner classes available?
57             try {
58                 Class clazz = Class.forName(ObjectStreamClasses.class.getName() + "$SerializableClass" + i++);
59                 queue.add(clazz);
60             } catch (ClassNotFoundException e) {
61                 break;
62             }
63         }
64         classes = new Class[queue.size()];
65 
66         // Make ObjectStreamClass load all classes into the static map
67         i = 0;
68         while (!queue.isEmpty()) {
69             classes[i] = (Class) queue.remove();
70             i++;
71         }
72     }
73 
74     /**
75      * Tests the static lookup function. Depending on JRE version the internal behavior is different but the general
76      * behavior is a synchronized call to some sort of static container.
77      */
78     @Benchmark
testLookup(Blackhole bh)79     public void testLookup(Blackhole bh) {
80         for (Class<?> klass : classes) {
81             bh.consume(ObjectStreamClass.lookup(klass));
82         }
83     }
84 
85     static class SerializableClass0 extends SerializableClass {
86         private static final long serialVersionUID = 1L;
87     }
88 
89     static class SerializableClass1 extends SerializableClass {
90         private static final long serialVersionUID = 1L;
91     }
92 
93     static class SerializableClass2 extends SerializableClass {
94         private static final long serialVersionUID = 1L;
95     }
96 
97     static class SerializableClass3 extends SerializableClass {
98         private static final long serialVersionUID = 1L;
99     }
100 
101     static class SerializableClass4 extends SerializableClass {
102         private static final long serialVersionUID = 1L;
103     }
104 
105     static class SerializableClass5 extends SerializableClass {
106         private static final long serialVersionUID = 1L;
107     }
108 
109     static class SerializableClass6 extends SerializableClass {
110         private static final long serialVersionUID = 1L;
111     }
112 
113     static class SerializableClass7 extends SerializableClass {
114         private static final long serialVersionUID = 1L;
115     }
116 
117     static class SerializableClass8 extends SerializableClass {
118         private static final long serialVersionUID = 1L;
119     }
120 
121     static class SerializableClass9 extends SerializableClass {
122         private static final long serialVersionUID = 1L;
123     }
124 
125     static class SerializableClass10 extends SerializableClass {
126         private static final long serialVersionUID = 1L;
127     }
128 
129     static class SerializableClass11 extends SerializableClass {
130         private static final long serialVersionUID = 1L;
131     }
132 
133     static class SerializableClass12 extends SerializableClass {
134         private static final long serialVersionUID = 1L;
135     }
136 
137     static class SerializableClass13 extends SerializableClass {
138         private static final long serialVersionUID = 1L;
139     }
140 
141     static class SerializableClass14 extends SerializableClass {
142         private static final long serialVersionUID = 1L;
143     }
144 
145     static class SerializableClass15 extends SerializableClass {
146         private static final long serialVersionUID = 1L;
147     }
148 
149     static class SerializableClass16 extends SerializableClass {
150         private static final long serialVersionUID = 1L;
151     }
152 
153     static class SerializableClass17 extends SerializableClass {
154         private static final long serialVersionUID = 1L;
155     }
156 
157     static class SerializableClass18 extends SerializableClass {
158         private static final long serialVersionUID = 1L;
159     }
160 
161     static class SerializableClass19 extends SerializableClass {
162         private static final long serialVersionUID = 1L;
163     }
164 
165     static class SerializableClass20 extends SerializableClass {
166         private static final long serialVersionUID = 1L;
167     }
168 
169     static class SerializableClass21 extends SerializableClass {
170         private static final long serialVersionUID = 1L;
171     }
172 
173     static class SerializableClass22 extends SerializableClass {
174         private static final long serialVersionUID = 1L;
175     }
176 
177     static class SerializableClass23 extends SerializableClass {
178         private static final long serialVersionUID = 1L;
179     }
180 
181     static class SerializableClass24 extends SerializableClass {
182         private static final long serialVersionUID = 1L;
183     }
184 
185     static class SerializableClass25 extends SerializableClass {
186         private static final long serialVersionUID = 1L;
187     }
188 
189     static class SerializableClass26 extends SerializableClass {
190         private static final long serialVersionUID = 1L;
191     }
192 
193     static class SerializableClass27 extends SerializableClass {
194         private static final long serialVersionUID = 1L;
195     }
196 
197     static class SerializableClass28 extends SerializableClass {
198         private static final long serialVersionUID = 1L;
199     }
200 
201     static class SerializableClass29 extends SerializableClass {
202         private static final long serialVersionUID = 1L;
203     }
204 
205     @SuppressWarnings("unused")
206     private static class SerializableClass implements Serializable {
207 
208         private static final long serialVersionUID = 6107539118220989250L;
209         public Object objectField00 = new Object();
210         public Object objectField01 = new Object();
211         public Object objectField02 = new Object();
212         public Object objectField03 = new Object();
213         public Object objectField04 = new Object();
214         public Object objectField05 = new Object();
215         public Object objectField06 = new Object();
216         public Object objectField07 = new Object();
217         public Object objectField08 = new Object();
218         public Object objectField09 = new Object();
219         public Object objectField10 = new Object();
220         public Object objectField11 = new Object();
221         public Object objectField12 = new Object();
222         public Object objectField13 = new Object();
223         public Object objectField14 = new Object();
224         public Object objectField15 = new Object();
225         public Object objectField16 = new Object();
226         public Object objectField17 = new Object();
227         public Object objectField18 = new Object();
228         public Object objectField19 = new Object();
229         public Object objectField20 = new Object();
230         public Object objectField21 = new Object();
231         public Object objectField22 = new Object();
232         public Object objectField23 = new Object();
233         public Object objectField24 = new Object();
234         public Object objectField25 = new Object();
235         public Object objectField26 = new Object();
236         public Object objectField27 = new Object();
237         public Object objectField28 = new Object();
238         public Object objectField29 = new Object();
239 
SerializableClass()240         SerializableClass() {
241             super();
242         }
243     }
244 }
245