172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartierpublic class Main { 372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier static class SuperClass { 472d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier protected static int getVar(int w) { 572d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier return w & 0xF; 672d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 772d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 872d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier static class SubClass extends SuperClass { 972d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier final int getVarDirect(int w) { 1072d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier return w & 0xF; 1172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 1272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier public void testDirect(int max) { 1372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier for (int i = 0; i < max; ++i) { 1472d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier getVarDirect(max); 1572d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 1672d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 1772d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier public void testStatic(int max) { 1872d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier for (int i = 0; i < max; ++i) { 1972d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier getVar(max); 2072d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 2172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 2272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 2372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 2472d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier static public void main(String[] args) throws Exception { 2572d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier boolean timing = (args.length >= 1) && args[0].equals("--timing"); 2672d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier run(timing); 2772d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 2872d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 2972d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier static int testBasis(int interations) { 3072d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier (new SubClass()).testDirect(interations); 3172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier return interations; 3272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 3372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 3472d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier static int testStatic(int interations) { 3572d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier (new SubClass()).testStatic(interations); 3672d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier return interations; 3772d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 3872d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 3972d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier static public void run(boolean timing) { 4072d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier long time0 = System.nanoTime(); 4172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier int count1 = testBasis(50000000); 4272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier long time1 = System.nanoTime(); 4372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier int count2 = testStatic(50000000); 4472d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier long time2 = System.nanoTime(); 4572d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 4672d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier System.out.println("basis: performed " + count1 + " iterations"); 4772d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier System.out.println("test1: performed " + count2 + " iterations"); 4872d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 4972d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier double basisMsec = (time1 - time0) / (double) count1 / 1000000; 5072d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier double msec1 = (time2 - time1) / (double) count2 / 1000000; 5172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier 5272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier if (msec1 < basisMsec * 5) { 5372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier System.out.println("Timing is acceptable."); 5472d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } else { 5572d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier System.out.println("Iterations are taking too long!"); 5672d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier timing = true; 5772d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 5872d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier if (timing) { 5972d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier System.out.printf("basis time: %.3g msec\n", basisMsec); 6072d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier System.out.printf("test1: %.3g msec per iteration\n", msec1); 6172d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 6272d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier } 6372d72ef51aef106d6f0300a72b583bcc5cd90a13Mathieu Chartier} 64