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