• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 import otherpackage.OtherPackagePublicEnum;
2 
3 public class Main {
4     /** used by {@link #basisCall} */
5     static private int basisTestValue = 12;
6 
main(String[] args)7     static public void main(String[] args) throws Exception {
8         boolean timing = (args.length >= 1) && args[0].equals("--timing");
9         run(timing);
10     }
11 
run(boolean timing)12     static public void run(boolean timing) {
13         preTest();
14 
15         long time0 = System.nanoTime();
16         int count1 = test1(500);
17         long time1 = System.nanoTime();
18         int count2 = test2(500);
19         long time2 = System.nanoTime();
20         int count3 = test3(500);
21         long time3 = System.nanoTime();
22         int count4 = basis(2000);
23         long time4 = System.nanoTime();
24 
25         System.out.println("basis: performed " + count4 + " iterations");
26         System.out.println("test1: performed " + count1 + " iterations");
27         System.out.println("test2: performed " + count2 + " iterations");
28         System.out.println("test3: performed " + count3 + " iterations");
29 
30         double msec1 = (time1 - time0) / (double) count1 / 1000000;
31         double msec2 = (time2 - time1) / (double) count2 / 1000000;
32         double msec3 = (time3 - time2) / (double) count3 / 1000000;
33         double basisMsec = (time4 - time3) / (double) count4 / 1000000;
34 
35         double avg = (msec1 + msec2 + msec3) / 3;
36         if (avg < (basisMsec * 25)) {
37             System.out.println("Timing is acceptable.");
38         } else {
39             System.out.println("Iterations are taking too long!");
40             timing = true;
41         }
42 
43         if (timing) {
44             System.out.printf("basis time: %.3g msec\n", basisMsec);
45             System.out.printf("test1: %.3g msec per iteration\n", msec1);
46             System.out.printf("test2: %.3g msec per iteration\n", msec2);
47             System.out.printf("test3: %.3g msec per iteration\n", msec3);
48         }
49 
50     }
51 
preTest()52     static public void preTest() {
53         /*
54          * This is meant to ensure that the basic enum functionality
55          * really is working.
56          */
57 
58         Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class;
59 
60         System.out.println(Enum.valueOf(c, "FOUR"));
61         System.out.println(Enum.valueOf(c, "ONE"));
62         System.out.println(Enum.valueOf(c, "FOURTEEN"));
63         System.out.println(Enum.valueOf(c, "NINE"));
64         System.out.println(Enum.valueOf(c, "FIVE"));
65         System.out.println(Enum.valueOf(c, "TWELVE"));
66 
67         System.out.println(Enum.valueOf(c, "ZERO").getClass().getName());
68     }
69 
basis(int iters)70     static public int basis(int iters) {
71         /*
72          * The basis time is the time taken to call a static method
73          * passing two arguments, which in turn accesses a static
74          * variable, compares a string, and does a little trivial math
75          * and a trivial comparison. (That is, this is a mini
76          * "omnibus" performance metric.) This is clearly going to be
77          * much faster than Enum.valueOf(), which is why we multiply
78          * the time before testing.
79          */
80         for (int i = iters; i > 0; i--) {
81             basisCall(i, "aname");
82             basisCall(i, "bname");
83             basisCall(i, "cname");
84             basisCall(i, "dname");
85             basisCall(i, "ename");
86             basisCall(i, "fname");
87             basisCall(i, "gname");
88             basisCall(i, "hname");
89             basisCall(i, "iname");
90             basisCall(i, "jname");
91             basisCall(i, "kname");
92             basisCall(i, "lname");
93             basisCall(i, "mname");
94             basisCall(i, "nname");
95             basisCall(i, "oname");
96             basisCall(i, "pname");
97             basisCall(i, "qname");
98             basisCall(i, "rname");
99             basisCall(i, "sname");
100             basisCall(i, "tname");
101         }
102 
103         return iters * 20;
104     }
105 
basisCall(int i, String name)106     static public int basisCall(int i, String name) {
107         int compare = name.compareTo("fuzzbot");
108 
109         if (i < (basisTestValue * compare)) {
110             return basisTestValue;
111         } else {
112             return i;
113         }
114     }
115 
test1(int iters)116     static public int test1(int iters) {
117         Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class;
118         for (int i = iters; i > 0; i--) {
119             Enum.valueOf(c, "ZERO");
120             Enum.valueOf(c, "ONE");
121             Enum.valueOf(c, "TWO");
122             Enum.valueOf(c, "THREE");
123             Enum.valueOf(c, "FOUR");
124             Enum.valueOf(c, "FIVE");
125             Enum.valueOf(c, "SIX");
126             Enum.valueOf(c, "SEVEN");
127             Enum.valueOf(c, "EIGHT");
128             Enum.valueOf(c, "NINE");
129             Enum.valueOf(c, "TEN");
130             Enum.valueOf(c, "ELEVEN");
131             Enum.valueOf(c, "TWELVE");
132             Enum.valueOf(c, "THIRTEEN");
133             Enum.valueOf(c, "FOURTEEN");
134             Enum.valueOf(c, "FIFTEEN");
135             Enum.valueOf(c, "SIXTEEN");
136             Enum.valueOf(c, "SEVENTEEN");
137             Enum.valueOf(c, "EIGHTEEN");
138             Enum.valueOf(c, "NINETEEN");
139         }
140 
141         return iters * 20;
142     }
143 
test2(int iters)144     static public int test2(int iters) {
145         Class<SamePackagePrivateEnum> c = SamePackagePrivateEnum.class;
146         for (int i = iters; i > 0; i--) {
147             Enum.valueOf(c, "ZERO");
148             Enum.valueOf(c, "ONE");
149             Enum.valueOf(c, "TWO");
150             Enum.valueOf(c, "THREE");
151             Enum.valueOf(c, "FOUR");
152             Enum.valueOf(c, "FIVE");
153             Enum.valueOf(c, "SIX");
154             Enum.valueOf(c, "SEVEN");
155             Enum.valueOf(c, "EIGHT");
156             Enum.valueOf(c, "NINE");
157             Enum.valueOf(c, "TEN");
158             Enum.valueOf(c, "ELEVEN");
159             Enum.valueOf(c, "TWELVE");
160             Enum.valueOf(c, "THIRTEEN");
161             Enum.valueOf(c, "FOURTEEN");
162             Enum.valueOf(c, "FIFTEEN");
163             Enum.valueOf(c, "SIXTEEN");
164             Enum.valueOf(c, "SEVENTEEN");
165             Enum.valueOf(c, "EIGHTEEN");
166             Enum.valueOf(c, "NINETEEN");
167         }
168 
169         return iters * 20;
170     }
171 
test3(int iters)172     static public int test3(int iters) {
173         Class<OtherPackagePublicEnum> c = OtherPackagePublicEnum.class;
174         for (int i = iters; i > 0; i--) {
175             Enum.valueOf(c, "ZERO");
176             Enum.valueOf(c, "ONE");
177             Enum.valueOf(c, "TWO");
178             Enum.valueOf(c, "THREE");
179             Enum.valueOf(c, "FOUR");
180             Enum.valueOf(c, "FIVE");
181             Enum.valueOf(c, "SIX");
182             Enum.valueOf(c, "SEVEN");
183             Enum.valueOf(c, "EIGHT");
184             Enum.valueOf(c, "NINE");
185             Enum.valueOf(c, "TEN");
186             Enum.valueOf(c, "ELEVEN");
187             Enum.valueOf(c, "TWELVE");
188             Enum.valueOf(c, "THIRTEEN");
189             Enum.valueOf(c, "FOURTEEN");
190             Enum.valueOf(c, "FIFTEEN");
191             Enum.valueOf(c, "SIXTEEN");
192             Enum.valueOf(c, "SEVENTEEN");
193             Enum.valueOf(c, "EIGHTEEN");
194             Enum.valueOf(c, "NINETEEN");
195         }
196 
197         return iters * 20;
198     }
199 }
200