1 /*
2  * Copyright (c) 1999, 2008, 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 
24 /*
25  *
26  */
27 
28 package bench.serial;
29 
30 import bench.Benchmark;
31 import java.io.ObjectInputStream;
32 import java.io.ObjectOutputStream;
33 import java.io.ObjectStreamClass;
34 import java.io.Serializable;
35 
36 /**
37  * Benchmark for testing speed of class descriptor reads/writes.
38  */
39 public class ClassDesc implements Benchmark {
40 
41     static class Dummy0 implements Serializable { Dummy0 i0; }
42     static class Dummy1 extends Dummy0 { Dummy1 i1; }
43     static class Dummy2 extends Dummy1 { Dummy2 i2; }
44     static class Dummy3 extends Dummy2 { Dummy3 i3; }
45     static class Dummy4 extends Dummy3 { Dummy4 i4; }
46     static class Dummy5 extends Dummy4 { Dummy5 i5; }
47     static class Dummy6 extends Dummy5 { Dummy6 i6; }
48     static class Dummy7 extends Dummy6 { Dummy7 i7; }
49     static class Dummy8 extends Dummy7 { Dummy8 i8; }
50     static class Dummy9 extends Dummy8 { Dummy9 i9; }
51     static class Dummy10 extends Dummy9 { Dummy10 i10; }
52     static class Dummy11 extends Dummy10 { Dummy11 i11; }
53     static class Dummy12 extends Dummy11 { Dummy12 i12; }
54     static class Dummy13 extends Dummy12 { Dummy13 i13; }
55     static class Dummy14 extends Dummy13 { Dummy14 i14; }
56     static class Dummy15 extends Dummy14 { Dummy15 i15; }
57     static class Dummy16 extends Dummy15 { Dummy16 i16; }
58     static class Dummy17 extends Dummy16 { Dummy17 i17; }
59     static class Dummy18 extends Dummy17 { Dummy18 i18; }
60     static class Dummy19 extends Dummy18 { Dummy19 i19; }
61     static class Dummy20 extends Dummy19 { Dummy20 i20; }
62     static class Dummy21 extends Dummy20 { Dummy21 i21; }
63     static class Dummy22 extends Dummy21 { Dummy22 i22; }
64     static class Dummy23 extends Dummy22 { Dummy23 i23; }
65     static class Dummy24 extends Dummy23 { Dummy24 i24; }
66     static class Dummy25 extends Dummy24 { Dummy25 i25; }
67     static class Dummy26 extends Dummy25 { Dummy26 i26; }
68     static class Dummy27 extends Dummy26 { Dummy27 i27; }
69     static class Dummy28 extends Dummy27 { Dummy28 i28; }
70     static class Dummy29 extends Dummy28 { Dummy29 i29; }
71     static class Dummy30 extends Dummy29 { Dummy30 i30; }
72     static class Dummy31 extends Dummy30 { Dummy31 i31; }
73     static class Dummy32 extends Dummy31 { Dummy32 i32; }
74     static class Dummy33 extends Dummy32 { Dummy33 i33; }
75     static class Dummy34 extends Dummy33 { Dummy34 i34; }
76     static class Dummy35 extends Dummy34 { Dummy35 i35; }
77     static class Dummy36 extends Dummy35 { Dummy36 i36; }
78     static class Dummy37 extends Dummy36 { Dummy37 i37; }
79     static class Dummy38 extends Dummy37 { Dummy38 i38; }
80     static class Dummy39 extends Dummy38 { Dummy39 i39; }
81     static class Dummy40 extends Dummy39 { Dummy40 i40; }
82     static class Dummy41 extends Dummy40 { Dummy41 i41; }
83     static class Dummy42 extends Dummy41 { Dummy42 i42; }
84     static class Dummy43 extends Dummy42 { Dummy43 i43; }
85     static class Dummy44 extends Dummy43 { Dummy44 i44; }
86     static class Dummy45 extends Dummy44 { Dummy45 i45; }
87     static class Dummy46 extends Dummy45 { Dummy46 i46; }
88     static class Dummy47 extends Dummy46 { Dummy47 i47; }
89     static class Dummy48 extends Dummy47 { Dummy48 i48; }
90     static class Dummy49 extends Dummy48 { Dummy49 i49; }
91     static class Dummy50 extends Dummy49 { Dummy50 i50; }
92 
93     /**
94      * Write and read class descriptors to/from a stream.
95      * Arguments: <# cycles>
96      */
run(String[] args)97     public long run(String[] args) throws Exception {
98         int ncycles = Integer.parseInt(args[0]);
99         StreamBuffer sbuf = new StreamBuffer();
100         ObjectOutputStream oout =
101             new ObjectOutputStream(sbuf.getOutputStream());
102         ObjectInputStream oin =
103             new ObjectInputStream(sbuf.getInputStream());
104         ObjectStreamClass desc = ObjectStreamClass.lookup(Dummy50.class);
105 
106         doReps(oout, oin, sbuf, desc, 1);       // warmup
107 
108         long start = System.currentTimeMillis();
109         doReps(oout, oin, sbuf, desc, ncycles);
110         return System.currentTimeMillis() - start;
111     }
112 
113     /**
114      * Run benchmark for given number of cycles.
115      */
doReps(ObjectOutputStream oout, ObjectInputStream oin, StreamBuffer sbuf, ObjectStreamClass desc, int ncycles)116     void doReps(ObjectOutputStream oout, ObjectInputStream oin,
117                 StreamBuffer sbuf, ObjectStreamClass desc, int ncycles)
118         throws Exception
119     {
120         for (int i = 0; i < ncycles; i++) {
121             sbuf.reset();
122             oout.reset();
123             oout.writeObject(desc);
124             oout.flush();
125             oin.readObject();
126         }
127     }
128 }
129