TimePrimitives.java


Below is the syntax highlighted version of TimePrimitives.java from §4.1 Performance.


/*************************************************************************
 *  Compilation:  javac TimePrimitives.java
 *  Execution:    java TimePrimitives 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 TimePrimitives 1000000
 *
 *
 *************************************************************************/

public class TimePrimitives {

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

    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        Stopwatch timer = new Stopwatch();
        double freq, elapsed;

        System.out.println("Nanoseconds per operation");
 
       /***************************************************************
        * empty loop
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                ;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Empty loop:" + "\t" + freq);


       /***************************************************************
        * addition
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i + j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Integer addition:" + "\t" + freq);

       /***************************************************************
        * integer subtraction
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i - j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Integer subtraction:" + "\t" + freq);


       /***************************************************************
        * multiplication
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i * j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Multiply:" + "\t" + freq);


       /***************************************************************
        * comparison
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            boolean b;
            for (int j = 1; j <= N; j++) {
                b = (i < j);
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Comparison:" + "\t" + freq);


       /***************************************************************
        * remainder
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i % j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Remainder:" + "\t" + freq);


       /***************************************************************
        * division
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i / j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Division:" + "\t" + freq);


       /***************************************************************
        * floating point add
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            double k;
            double fi = i;
            for (int j = 1; j <= N; j++) {
                k = fi + j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Float Add:" + "\t" + freq);


       /***************************************************************
        * floating point add
        ***************************************************************/
        timer = new Stopwatch();
        for (double i = 1; i <= N; i++) {
            double k;
            double fi = i;
            for (double j = 1; j <= N; j++) {
                k = fi - j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Float subtraction:" + "\t" + freq);


       /***************************************************************
        * floating point division
        ***************************************************************/
        timer = new Stopwatch();
        for (double i = 1; i <= N; i++) {
            double k;
            double fi = i;
            for (double j = 1; j <= N; j++) {
                k = fi / j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Float Division:" + "\t" + freq);


       /***************************************************************
        * floating point multiply
        ***************************************************************/
        timer = new Stopwatch();
        for (double i = 1; i <= N; i++) {
            double fi = i;
            double k;
            for (double j = 1; j <= N; j++) {
                k = fi * j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Float Multiply:" + "\t" + freq);


       /***************************************************************
        * Empty integer function call
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = f(i, j);
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Function call:" + "\t" + freq);


       /***************************************************************
        * Math.sin
        ***************************************************************/
        timer = new Stopwatch();
        for (double i = 1; i <= N/10.0; i++) {
            double k;
            for (double j = 1; j <= N; j++) {
                k = Math.sin(i + j);
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N * 10;
        System.out.println("Math.sin:" + "\t" + freq);

       /***************************************************************
        * Math.atan2
        ***************************************************************/
        timer = new Stopwatch();
        for (double i = 1; i <= N/10.0; i++) {
            double k;
            for (double j = 1; j <= N; j++) {
                k = Math.atan2(i, j);
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N * 10;
        System.out.println("Math.atan2:" + "\t" + freq);

       /***************************************************************
        * Math.random
        ***************************************************************/
        timer = new Stopwatch();
        for (double i = 1; i <= N/10.0; i++) {
            double k;
            for (double j = 1; j <= N; j++) {
                k = Math.random();
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N * 10;
        System.out.println("Math.random:" + "\t" + freq);

       /***************************************************************
        * addition
        ***************************************************************/
        timer = new Stopwatch();
        for (int i = 1; i <= N; i++) {
            int k;
            for (int j = 1; j <= N; j++) {
                k = i + j;
            }
        }
        elapsed = timer.elapsedTime();
        freq = 1.0E9 * elapsed / N / N;
        System.out.println("Integer addition:" + "\t" + freq);
   }

}



Copyright © 2000–2011, Robert Sedgewick and Kevin Wayne.
Last updated: Wed Feb 9 09:17:30 EST 2011.