blob: d5903af69761429b0a767efbcee5b113cc02de57 [file] [log] [blame]
jeffhao5d1ac922011-09-29 17:41:15 -07001import otherpackage.OtherPackagePublicEnum;
2
Elliott Hughesa5c0c212011-12-16 15:25:15 -08003import java.lang.reflect.*;
4
jeffhao5d1ac922011-09-29 17:41:15 -07005public class Main {
6 /** used by {@link #basisCall} */
7 static private int basisTestValue = 12;
8
9 static public void main(String[] args) throws Exception {
Elliott Hughesa5c0c212011-12-16 15:25:15 -080010 try {
11 Class<?> enumClass = Enum.class;
12 Method enumValueOf = null;
13 for (Method m : enumClass.getDeclaredMethods()) {
14 if (m.getName().equals("valueOf")) {
15 enumValueOf = m;
16 break;
17 }
18 }
19 enumValueOf.invoke(null, String.class, "blah");
20 throw new AssertionError();
21 } catch (InvocationTargetException expected) {
22 IllegalArgumentException iae = (IllegalArgumentException) expected.getCause();
23 if (!iae.getMessage().equals("class java.lang.String is not an enum type")) {
24 throw new AssertionError();
25 }
26 }
27
jeffhao5d1ac922011-09-29 17:41:15 -070028 boolean timing = (args.length >= 1) && args[0].equals("--timing");
29 run(timing);
30 }
31
32 static public void run(boolean timing) {
33 preTest();
34
35 long time0 = System.nanoTime();
36 int count1 = test1(500);
37 long time1 = System.nanoTime();
38 int count2 = test2(500);
39 long time2 = System.nanoTime();
40 int count3 = test3(500);
41 long time3 = System.nanoTime();
42 int count4 = basis(500);
43 long time4 = System.nanoTime();
44
45 System.out.println("basis: performed " + count4 + " iterations");
46 System.out.println("test1: performed " + count1 + " iterations");
47 System.out.println("test2: performed " + count2 + " iterations");
48 System.out.println("test3: performed " + count3 + " iterations");
49
50 double msec1 = (time1 - time0) / (double) count1 / 1000000;
51 double msec2 = (time2 - time1) / (double) count2 / 1000000;
52 double msec3 = (time3 - time2) / (double) count3 / 1000000;
53 double basisMsec = (time4 - time3) / (double) count4 / 1000000;
54
55 double avg = (msec1 + msec2 + msec3) / 3;
56 if (avg < (basisMsec * 10)) {
57 System.out.println("Timing is acceptable.");
58 } else {
59 System.out.println("Iterations are taking too long!");
60 timing = true;
61 }
62
63 if (timing) {
64 System.out.printf("basis time: %.3g msec\n", basisMsec);
65 System.out.printf("test1: %.3g msec per iteration\n", msec1);
66 System.out.printf("test2: %.3g msec per iteration\n", msec2);
67 System.out.printf("test3: %.3g msec per iteration\n", msec3);
68 }
69
70 }
71
72 static public void preTest() {
73 /*
74 * This is meant to ensure that the basic enum functionality
75 * really is working.
76 */
77
78 Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class;
79
80 System.out.println(Enum.valueOf(c, "FOUR"));
81 System.out.println(Enum.valueOf(c, "ONE"));
82 System.out.println(Enum.valueOf(c, "FOURTEEN"));
83 System.out.println(Enum.valueOf(c, "NINE"));
84 System.out.println(Enum.valueOf(c, "FIVE"));
85 System.out.println(Enum.valueOf(c, "TWELVE"));
86
87 System.out.println(Enum.valueOf(c, "ZERO").getClass().getName());
88 }
89
90 static final String[] BASIS_COMPARE_ARRAY = {
91 "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT",
92 "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN",
93 "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"
94 };
95
96 static public int basis(int iters) {
97 for (int i = iters; i > 0; i--) {
98 basisValueOf("ZERO");
99 basisValueOf("ONE");
100 basisValueOf("TWO");
101 basisValueOf("THREE");
102 basisValueOf("FOUR");
103 basisValueOf("FIVE");
104 basisValueOf("SIX");
105 basisValueOf("SEVEN");
106 basisValueOf("EIGHT");
107 basisValueOf("NINE");
108 basisValueOf("TEN");
109 basisValueOf("ELEVEN");
110 basisValueOf("TWELVE");
111 basisValueOf("THIRTEEN");
112 basisValueOf("FOURTEEN");
113 basisValueOf("FIFTEEN");
114 basisValueOf("SIXTEEN");
115 basisValueOf("SEVENTEEN");
116 basisValueOf("EIGHTEEN");
117 basisValueOf("NINETEEN");
118 }
119
120 return iters * 20;
121 }
122
123 static String basisValueOf(String key) {
124 for (String s : BASIS_COMPARE_ARRAY) {
125 if (s.equals(key)) {
126 return s;
127 }
128 }
129 throw new IllegalArgumentException();
130 }
131
132 static public int test1(int iters) {
133 Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class;
134 for (int i = iters; i > 0; i--) {
135 Enum.valueOf(c, "ZERO");
136 Enum.valueOf(c, "ONE");
137 Enum.valueOf(c, "TWO");
138 Enum.valueOf(c, "THREE");
139 Enum.valueOf(c, "FOUR");
140 Enum.valueOf(c, "FIVE");
141 Enum.valueOf(c, "SIX");
142 Enum.valueOf(c, "SEVEN");
143 Enum.valueOf(c, "EIGHT");
144 Enum.valueOf(c, "NINE");
145 Enum.valueOf(c, "TEN");
146 Enum.valueOf(c, "ELEVEN");
147 Enum.valueOf(c, "TWELVE");
148 Enum.valueOf(c, "THIRTEEN");
149 Enum.valueOf(c, "FOURTEEN");
150 Enum.valueOf(c, "FIFTEEN");
151 Enum.valueOf(c, "SIXTEEN");
152 Enum.valueOf(c, "SEVENTEEN");
153 Enum.valueOf(c, "EIGHTEEN");
154 Enum.valueOf(c, "NINETEEN");
155 }
156
157 return iters * 20;
158 }
159
160 static public int test2(int iters) {
161 Class<SamePackagePrivateEnum> c = SamePackagePrivateEnum.class;
162 for (int i = iters; i > 0; i--) {
163 Enum.valueOf(c, "ZERO");
164 Enum.valueOf(c, "ONE");
165 Enum.valueOf(c, "TWO");
166 Enum.valueOf(c, "THREE");
167 Enum.valueOf(c, "FOUR");
168 Enum.valueOf(c, "FIVE");
169 Enum.valueOf(c, "SIX");
170 Enum.valueOf(c, "SEVEN");
171 Enum.valueOf(c, "EIGHT");
172 Enum.valueOf(c, "NINE");
173 Enum.valueOf(c, "TEN");
174 Enum.valueOf(c, "ELEVEN");
175 Enum.valueOf(c, "TWELVE");
176 Enum.valueOf(c, "THIRTEEN");
177 Enum.valueOf(c, "FOURTEEN");
178 Enum.valueOf(c, "FIFTEEN");
179 Enum.valueOf(c, "SIXTEEN");
180 Enum.valueOf(c, "SEVENTEEN");
181 Enum.valueOf(c, "EIGHTEEN");
182 Enum.valueOf(c, "NINETEEN");
183 }
184
185 return iters * 20;
186 }
187
188 static public int test3(int iters) {
189 Class<OtherPackagePublicEnum> c = OtherPackagePublicEnum.class;
190 for (int i = iters; i > 0; i--) {
191 Enum.valueOf(c, "ZERO");
192 Enum.valueOf(c, "ONE");
193 Enum.valueOf(c, "TWO");
194 Enum.valueOf(c, "THREE");
195 Enum.valueOf(c, "FOUR");
196 Enum.valueOf(c, "FIVE");
197 Enum.valueOf(c, "SIX");
198 Enum.valueOf(c, "SEVEN");
199 Enum.valueOf(c, "EIGHT");
200 Enum.valueOf(c, "NINE");
201 Enum.valueOf(c, "TEN");
202 Enum.valueOf(c, "ELEVEN");
203 Enum.valueOf(c, "TWELVE");
204 Enum.valueOf(c, "THIRTEEN");
205 Enum.valueOf(c, "FOURTEEN");
206 Enum.valueOf(c, "FIFTEEN");
207 Enum.valueOf(c, "SIXTEEN");
208 Enum.valueOf(c, "SEVENTEEN");
209 Enum.valueOf(c, "EIGHTEEN");
210 Enum.valueOf(c, "NINETEEN");
211 }
212
213 return iters * 20;
214 }
215}