/****************************************************************************** * 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(); } } }