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