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