Timing.java


Below is the syntax highlighted version of Timing.java from §9.7 Optimization.


/******************************************************************************
 *  Compilation:  javac Timing.java
 *  Execution:    java Timing N
 *  
 *  Determine the amount of time it takes to call +, %, Math.random,
 *  Math.sin, Math.sqrt, Math.pow on your system.
 *
 *  Dificulty since compiler may optimize away some code.
 * 
 *  % java Timing 1000000
 *
 *
 ******************************************************************************/

class Timing {

    public static int f(int i, int j) { return 0; }

    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        long start, stop, elapsed;
        double freq;

while(true) {
      
        StdOut.println("Nanoseconds per operation");
 
       /***************************************************************
        * empty loop
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                ;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Empty loop:" + "\t" + freq);


       /***************************************************************
        * addition
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i + j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Addition:" + "\t" + freq);


       /***************************************************************
        * multiplication
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i * j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Multiply:" + "\t" + freq);


       /***************************************************************
        * comparison
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            boolean b;
            for (int j = 1; j <= N; j++) {
                b = (i < j);
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Boolean:" + "\t" + freq);


       /***************************************************************
        * remainder
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i % j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Remainder:" + "\t" + freq);


       /***************************************************************
        * division
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i / j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Division:" + "\t" + freq);


       /***************************************************************
        * floating point add
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            double k;
            double fi = i;
            for (int j = 1; j <= N; j++) {
                k = fi + j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Float Add:" + "\t" + freq);


       /***************************************************************
        * floating point division
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            double k;
            double fi = i;
            for (int j = 1; j <= N; j++) {
                k = fi / j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Float Division:" + "\t" + freq);


       /***************************************************************
        * floating point multiply
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            double fi = i;
            double k;
            for (int j = 1; j <= N; j++) {
                k = fi * j;
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Float Multiply:" + "\t" + freq);


       /***************************************************************
        * Empty integer function call
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = f(i, j);
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Function call:" + "\t" + freq);


       /***************************************************************
        * Math.sin
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            double k;
            for (int j = 1; j <= N; j++) {
                k = Math.sin(i + j);
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Math.sin:" + "\t" + freq);

       /***************************************************************
        * Math.atan2
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            double k;
            for (int j = 1; j <= N; j++) {
                k = Math.atan2(i, j);
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Math.atan2:" + "\t" + freq);

       /***************************************************************
        * Math.random
        ***************************************************************/
        start = System.currentTimeMillis();
        for (int i = 1; i <= N; i++) {
            double k;
            for (int j = 1; j <= N; j++) {
                k = Math.random();
            }
        }
        stop = System.currentTimeMillis();
        elapsed = stop - start;
        freq = 1.0E6 * elapsed / N / N;
        StdOut.println("Math.random:" + "\t" + freq);

StdOut.println();
}

   }

}



Copyright © 2000–2017, Robert Sedgewick and Kevin Wayne.
Last updated: Fri Oct 20 14:12:12 EDT 2017.