Main.java revision 2ad60cfc28e14ee8f0bb038720836a4696c478ad
1import otherpackage.OtherPackagePublicEnum;
2
3public class Main {
4    /** used by {@link #basisCall} */
5    static private int basisTestValue = 12;
6
7    static public void main(String[] args) throws Exception {
8        boolean timing = (args.length >= 1) && args[0].equals("--timing");
9        run(timing);
10    }
11
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
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
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
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
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
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
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