/************************************************************************* * 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. * * Difficulty since compiler may optimize away some code. * * % java TimePrimitives 1000000 * * From A Princeton class website. * * History: * Josiah Yoder, Spring 2013, Week 2: * - Switched stopwatch to use nanoTime instead of currentTimeMillis. * - Added a few tests. * * Copyright © 2000–2011, Robert Sedgewick and Kevin Wayne. * Last princeton update before copy: Wed Feb 9 09:17:30 EST 2011. *************************************************************************/ package class2_1_TimePrimitives; public class TimePrimitives { public static int f(int i, int j) { return 0; } public static void main(String[] args) { int N = 100_000; int k; // test accumulator int k2 = 0; // Overall accumulator if (args.length > 0) { try { N = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("Usage: "); } } Stopwatch timer; double freq, elapsed; for (int burnInIndex = 0; burnInIndex < 3; burnInIndex++) { System.out.println(); System.out.println("Nanoseconds per operation (Burn-in index: "+burnInIndex+")"); /*************************************************************** * Nothing at all ***************************************************************/ timer = new Stopwatch(); elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Nothing:" + "\t" + freq); /*************************************************************** * 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); // /*************************************************************** // * 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); // // /*************************************************************** // * 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(); k = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += i + j; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Integer addition:" + "\t" + freq); /*************************************************************** * Nothing at all ***************************************************************/ timer = new Stopwatch(); elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Nothing:" + "\t" + freq); /*************************************************************** * two additions, accumulation ***************************************************************/ timer = new Stopwatch(); k = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += i + j + k; } } elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Two integer additions:" + "\t" + freq); /*************************************************************** * integer subtraction ***************************************************************/ timer = new Stopwatch(); k = 0; for (int i = 1; i <= N; i++) { 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(); k = 0; for (int i = 1; i <= N; i++) { 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(); boolean b = false; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { b |= (i < j); } } elapsed = timer.elapsedTime(); k2 += b?1:0; 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(); k = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k = f(i, j); } } k2 +=k; 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(); k = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += i + j; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Integer addition:" + "\t" + freq); /*************************************************************** * addition - using result ***************************************************************/ timer = new Stopwatch(); k = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += i + j; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Integer addition (use result):" + "\t" + freq); /*************************************************************** * Array Access - first element ***************************************************************/ int[] array = new int[1_000_000]; timer = new Stopwatch(); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += array[0]; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("read array[0]: " + "\t" + freq); /*************************************************************** * Array Access - last element ***************************************************************/ timer = new Stopwatch(); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += array[500_000]; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("read array[500_000]:" + "\t" + freq); /*************************************************************** * Array Access - last element ***************************************************************/ timer = new Stopwatch(); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += array[999_999]; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("read array[999_999]:" + "\t" + freq); /*************************************************************** * Array write - middle element ***************************************************************/ timer = new Stopwatch(); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { k += array[500_000]; } } k2 += k; elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("write array[500_000]:" + "\t" + freq); /*************************************************************** * Nothing at all ***************************************************************/ timer = new Stopwatch(); elapsed = timer.elapsedTime(); freq = 1.0E9 * elapsed / N / N; System.out.println("Nothing:" + "\t" + freq); System.out.println("Result: (ignore) "+k2); } } }