Author: erans
Date: Sun Jul 31 14:04:41 2011
New Revision: 1152584

URL: http://svn.apache.org/viewvc?rev=1152584&view=rev
Log:
MATH-637
Replaced "DescriptiveStatistics" by "StatisticalSummary", as suggested
by Phil.
Added some "randomness" so that the timed code has a side-effect that
cannot be optimized away by the JIT compiler.

Modified:
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math/PerfTestUtils.java

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/PerfTestUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/PerfTestUtils.java?rev=1152584&r1=1152583&r2=1152584&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/PerfTestUtils.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/PerfTestUtils.java
 Sun Jul 31 14:04:41 2011
@@ -16,8 +16,10 @@
  */
 package org.apache.commons.math;
 
+import java.util.Random;
 import java.util.concurrent.Callable;
-import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
+import org.apache.commons.math.stat.descriptive.SummaryStatistics;
+import org.apache.commons.math.stat.descriptive.StatisticalSummary;
 import org.apache.commons.math.exception.MathIllegalStateException;
 
 /**
@@ -30,6 +32,8 @@ public class PerfTestUtils {
     private static final int DEFAULT_REPEAT_CHUNK = 1000;
     /** Default number of code repeats for computing the average run time. */
     private static final int DEFAULT_REPEAT_STAT = 10000;
+    /** RNG. */
+    private static Random rng = new Random();
 
     /**
      * Timing.
@@ -40,28 +44,28 @@ public class PerfTestUtils {
      * @param runGC Call {@code System.gc()} between each timed block. When
      * set to {@code true}, the test will run much slower.
      * @param methods Codes being timed.
-     * @return for each of the given {@code methods}, a statistics of the
-     * average times (in milliseconds) taken by a single call to the
-     * {@code call} method (i.e. the time taken by each timed block divided
-     * by {@code repeatChunk}).
+     * @return for each of the given {@code methods}, a
+     * {@link StatisticalSummary} of the average times (in milliseconds)
+     * taken by a single call to the {@code call} method (i.e. the time
+     * taken by each timed block divided by {@code repeatChunk}).
      */
-    public static DescriptiveStatistics[] time(int repeatChunk,
-                                               int repeatStat,
-                                               boolean runGC,
-                                               Callable<Double> ... methods) {
+    public static StatisticalSummary[] time(int repeatChunk,
+                                            int repeatStat,
+                                            boolean runGC,
+                                            Callable<Double> ... methods) {
         final double[][][] times = timesAndResults(repeatChunk,
                                                    repeatStat,
                                                    runGC,
                                                    methods);
 
         final int len = methods.length;
-        final DescriptiveStatistics[] stats = new DescriptiveStatistics[len];
+        final StatisticalSummary[] stats = new StatisticalSummary[len];
         for (int j = 0; j < len; j++) {
-            final DescriptiveStatistics s = new DescriptiveStatistics();
+            final SummaryStatistics s = new SummaryStatistics();
             for (int k = 0; k < repeatStat; k++) {
                 s.addValue(times[j][k][0]);
             }
-            stats[j] = s;
+            stats[j] = s.getSummary();
         }
 
         return stats;
@@ -104,18 +108,19 @@ public class PerfTestUtils {
                     }
 
                     final Callable<Double> r = methods[j];
-                    double result = 0;
+                    final double[] result = new double[repeatChunk];
 
                     // Timed block.
                     final long start = System.nanoTime();
                     for (int i = 0; i < repeatChunk; i++) {
-                        result = r.call();
+                        result[i] = r.call();
                     }
                     final long stop = System.nanoTime();
 
-                    // Collect run time and results.
+                    // Collect run time.
                     timesAndResults[j][k][0] = (stop - start) * NANO_TO_MILLI;
-                    timesAndResults[j][k][1] = result;
+                    // Keep track of a randomly selected result.
+                    timesAndResults[j][k][1] = 
result[rng.nextInt(repeatChunk)];
                 }
             }
         } catch (Exception e) {
@@ -136,6 +141,8 @@ public class PerfTestUtils {
     /**
      * Timing and report (to standard output) the average time and standard
      * deviation of a single call.
+     * The timing is performed by calling the
+     * {@link #time(int,int,boolean,Callable[]) time} method.
      *
      * @param title Title of the test (for the report).
      * @param repeatChunk Each timing measurement will done done for that
@@ -149,23 +156,26 @@ public class PerfTestUtils {
      * {@code call} method (i.e. the time taken by each timed block divided
      * by {@code repeatChunk}).
      */
-    public static DescriptiveStatistics[] timeAndReport(String title,
-                                                        int repeatChunk,
-                                                        int repeatStat,
-                                                        boolean runGC,
-                                                        RunTest ... methods) {
+    public static StatisticalSummary[] timeAndReport(String title,
+                                                     int repeatChunk,
+                                                     int repeatStat,
+                                                     boolean runGC,
+                                                     RunTest ... methods) {
         // Header format.
-        final String headerFormat = "%s (runs per timed block: %d, timed 
blocks: %d)";
+        final String hFormat = "%s (runs per timed block: %d, timed blocks: 
%d)";
         // Result format.
         final String format = "%15s: %e (%e) ms";
 
-        System.out.println(String.format(headerFormat,
+        System.out.println(String.format(hFormat,
                                          title,
                                          repeatChunk,
                                          repeatStat));
-        final DescriptiveStatistics[] time = time(repeatChunk, repeatStat, 
runGC, methods);
+        final StatisticalSummary[] time = time(repeatChunk,
+                                               repeatStat,
+                                               runGC,
+                                               methods);
         for (int i = 0, max = time.length; i < max; i++) {
-            final DescriptiveStatistics s = time[i];
+            final StatisticalSummary s = time[i];
             System.out.println(String.format(format,
                                              methods[i].getName(),
                                              s.getMean(),
@@ -187,8 +197,8 @@ public class PerfTestUtils {
      * {@code call} method (i.e. the time taken by each timed block divided
      * by {@code repeatChunk}).
      */
-    public static DescriptiveStatistics[] timeAndReport(String title,
-                                                        RunTest ... methods) {
+    public static StatisticalSummary[] timeAndReport(String title,
+                                                     RunTest ... methods) {
         return timeAndReport(title,
                              DEFAULT_REPEAT_CHUNK,
                              DEFAULT_REPEAT_STAT,


Reply via email to