You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2008/03/26 03:56:39 UTC

svn commit: r641124 - in /commons/sandbox/performance/trunk/src/java/org/apache/commons/performance: ClientThread.java LoadGenerator.java Statistics.java

Author: psteitz
Date: Tue Mar 25 19:56:37 2008
New Revision: 641124

URL: http://svn.apache.org/viewvc?rev=641124&view=rev
Log:
Completed implementation of statistics aggregators.

Modified:
    commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/ClientThread.java
    commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/LoadGenerator.java
    commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/Statistics.java

Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/ClientThread.java
URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/ClientThread.java?rev=641124&r1=641123&r2=641124&view=diff
==============================================================================
--- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/ClientThread.java (original)
+++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/ClientThread.java Tue Mar 25 19:56:37 2008
@@ -179,12 +179,16 @@
             return;
         }
         
-        // Report statistics
-        logger.info(stats.toString() + 
+        // Use thread name as process name
+        String process = Thread.currentThread().getName();
+        
+        // Record latency statistics
+        stats.addStatistics(responseStats, process, "latency");
+        
+        // Log accumulated statistics for this thread
+        logger.info(stats.displayProcessStatistics(process) + 
           "Number of misses: " + numMisses + "\n" +
-          "Number or errors: " + numErrors + "\n");
-        stats.addStatistics(
-                responseStats, Thread.currentThread().getName(), "latency");
+          "Number or errors: " + numErrors + "\n"); 
     }
     
     /** Executed once at the beginning of the run */

Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/LoadGenerator.java
URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/LoadGenerator.java?rev=641124&r1=641123&r2=641124&view=diff
==============================================================================
--- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/LoadGenerator.java (original)
+++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/LoadGenerator.java Tue Mar 25 19:56:37 2008
@@ -109,21 +109,8 @@
         // TODO: make this configurable
         ex.awaitTermination(60 * 60 * 24, TimeUnit.SECONDS);
         
-        // Compute and log summary statistics for accumulated metrics
-        Iterator<String> metricsIterator = stats.getTypes().iterator();
-        while (metricsIterator.hasNext()) {
-            String metric = metricsIterator.next();
-            logger.info("********** " + metric.toUpperCase() + " **********");
-            logger.info("Overall statistics for the mean " + metric);
-            logger.info(stats.getMeanSummary(metric).toString());
-            logger.info("Overall statistics for the standard deviation " 
-                    + metric);
-            logger.info(stats.getStdSummary(metric).toString());
-            logger.info("Overall statistics for the min " + metric);
-            logger.info(stats.getMinSummary(metric).toString());
-            logger.info("Overall statistics for the max " + metric);
-            logger.info(stats.getMaxSummary(metric).toString());      
-        }
+        // Log summary statistics for accumulated metrics
+        logger.info(stats.displayOverallSummary());
 	}
     
     protected abstract ClientThread makeClientThread(

Modified: commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/Statistics.java
URL: http://svn.apache.org/viewvc/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/Statistics.java?rev=641124&r1=641123&r2=641124&view=diff
==============================================================================
--- commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/Statistics.java (original)
+++ commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/Statistics.java Tue Mar 25 19:56:37 2008
@@ -29,53 +29,53 @@
  * <p>Maintains a HashMap of SummaryStatistics instances with a composite
  * key of the form <process,type>.  "Process" typically identifies the client
  * thread and "type" identifies the metric - e.g., "latency", "numActive."</p>
- * 
- * <p>NOTE: None of the methods of this class are synchronized.  For general
- * use outside of Commons Performance, synchronization (if necessary) must be
- * handled by client code.</p>
  *
  */
 public class Statistics {
     private HashMap<StatisticsKey,SummaryStatistics> data = 
         new HashMap <StatisticsKey,SummaryStatistics>();
-   
+    
     /**
-     * Adds a SummaryStatistics instance with key = <process,type>
+     * Adds the results of the given SummaryStatistics instance under
+     * the key <process,type>
      * 
-     * @param stats the SummaryStatistics to add
+     * @param stats the SummaryStatistics whose results we are adding
      * @param process name of the associated process
      * @param type description of the associated metric
      */
-    public void addStatistics(SummaryStatistics stats, String process, String type) {
+    public synchronized void addStatistics(SummaryStatistics stats,
+            String process, String type) {
         StatisticsKey key = new StatisticsKey(process, type);
         data.put(key, stats);
     }
     
     /**
-     * Retrieves the SummaryStatistics instance corresponding to the given
-     * process and type, if such an instance exists; null otherwise.
+     * Retrieves the SummaryStatistics corresponding to the given
+     * process and type, if this exists; null otherwise.
      * 
      * @param process name of the associated process
      * @param type description of the associated metric
      * @return SummaryStatistics for the given <process,type>; null if there is
      * no such element in the container
      */
-    public SummaryStatistics getStatistics(String process, String type) {
-        return data.get(new StatisticsKey(process, type));
+    public synchronized SummaryStatistics getStatistics(String process,
+            String type) {
+        StatisticsKey key = new StatisticsKey(process, type);
+        return data.get(key);
     }
     
     /**
-     * Returns the full list of SummaryStatistics instances corresponding to
+     * Returns the full list of SummaryStatistics corresponding to
      * the given <code>type</code> - i.e, the list of statistics of the 
      * given type across processes.  For example, 
-     * <code>getStatistics("latency")</code> will return a list of latency
+     * <code>getStatisticsByType("latency")</code> will return a list of latency
      * summaries, one for each process, assuming "latency" is the name of 
      * an accumulated metric.
      * 
      * @param type the type value to get statistics for
-     * @return the List of SummmaryStatistics stored under the given type
+     * @return the List of SummaryStatistics stored under the given type
      */
-    public List<SummaryStatistics> getStatistics(String type) {
+    public synchronized List<SummaryStatistics> getStatisticsByType(String type) {
         ArrayList<SummaryStatistics> result = new ArrayList<SummaryStatistics>();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -88,20 +88,43 @@
     }
     
     /**
-     * Returns SummaryStatistics for the mean of the given metric across
-     * processes - i.e., the "mean of the means", the "min of the means"
-     * etc. More precisely, the returned SummaryStatistics instance describes
-     * the distribution of the individual process means for the given metric.
-     * The same results could be obtained by iterating over the result of 
-     * {{@link #getStatistics(String)} for the given <code>type</code>,
+     * Returns the full list of SummaryStatistics corresponding to
+     * the given <code>process</code> - i.e, the list of statistics of
+     * of different types maintained for the given process. 
+     * 
+     * @param type the type value to get statistics for
+     * @return the List of SummaryStatistics for the given process
+     */
+    public synchronized List<SummaryStatistics> getStatisticsByProcess(
+            String process) {
+        ArrayList<SummaryStatistics> result = new ArrayList<SummaryStatistics>();
+        Iterator<StatisticsKey> it = data.keySet().iterator();
+        while (it.hasNext()) {
+            StatisticsKey key = it.next();
+            if (key.process.equals(process)) {
+                result.add(data.get(key));
+            }
+        }
+        return result;
+    }
+    
+    /**
+     * <p>Returns a SummaryStatistics instance describing the mean of the given
+     * metric across processes - i.e., the "mean of the means", the 
+     * "min of the means" etc. More precisely, the returned SummaryStatistics
+     * describes the distribution of the individual process means for the given
+     * metric.</p>
+     * 
+     * <p>The same results could be obtained by iterating over the result of 
+     * {{@link #getStatisticsByType(String)} for the given <code>type</code>,
      * extracting the mean and adding its value to a SummaryStatistics
-     * instance.
+     * instance.</p>
      * 
      * @param type the metric to get summary mean statistics for
      * @return a SummaryStatistics instance describing the process means for
      * the given metric
      */
-    public SummaryStatistics getMeanSummary(String type) {
+    public synchronized SummaryStatistics getMeanSummary(String type) {
         SummaryStatistics result = new SummaryStatistics();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -110,7 +133,7 @@
                 result.addValue(data.get(key).getMean());
             }
         }
-        return result; 
+        return result;
     }
     
     /**
@@ -122,7 +145,7 @@
      * deviations for the given metric
      * @see #getMeanSummary(String)
      */
-    public SummaryStatistics getStdSummary(String type) {
+    public synchronized SummaryStatistics getStdSummary(String type) {
         SummaryStatistics result = new SummaryStatistics();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -131,7 +154,7 @@
                 result.addValue(data.get(key).getStandardDeviation());
             }
         }
-        return result; 
+        return result;
     }
     
     /**
@@ -143,7 +166,7 @@
      * for the given metric
      * @see #getMeanSummary(String)
      */
-    public SummaryStatistics getMinSummary(String type) {
+    public synchronized SummaryStatistics getMinSummary(String type) {
         SummaryStatistics result = new SummaryStatistics();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -152,7 +175,7 @@
                 result.addValue(data.get(key).getMin());
             }
         }
-        return result; 
+        return result;
     }
     
     /**
@@ -160,11 +183,11 @@
      * processes.
      * 
      * @param type the metric to get summary maximum statistics for
-     * @return a SummaryStatistics instance describing the process maxima
+     * @return a SummaryStatistics describing the process maxima
      * for the given metric
      * @see #getMeanSummary(String)
      */
-    public SummaryStatistics getMaxSummary(String type) {
+    public synchronized SummaryStatistics getMaxSummary(String type) {
         SummaryStatistics result = new SummaryStatistics();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -173,7 +196,7 @@
                 result.addValue(data.get(key).getMax());
             }
         }
-        return result; 
+        return result;
     }
     
     /**
@@ -181,7 +204,7 @@
      * 
      * @return List of processes represented in the container
      */
-    public List<String> getProcesses() {
+    public synchronized List<String> getProcesses() {
         ArrayList<String> result = new ArrayList<String>();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -198,7 +221,7 @@
      * 
      * @return List of types represented in the container
      */
-    public List<String> getTypes() {
+    public synchronized List<String> getTypes() {
         ArrayList<String> result = new ArrayList<String>();
         Iterator<StatisticsKey> it = data.keySet().iterator();
         while (it.hasNext()) {
@@ -211,6 +234,63 @@
     }
     
     /**
+     * Computes and formats display of summary statistics by type, across
+     * processes. 
+     * 
+     * @return String representing summaries for each metric 
+     */
+    public synchronized String displayOverallSummary() {
+        Iterator<String> metricsIterator = getTypes().iterator();
+        StringBuffer buffer = new StringBuffer();
+        while (metricsIterator.hasNext()) {
+            String metric = metricsIterator.next();
+            buffer.append("Overall statistics for the mean ");
+            buffer.append(metric.toUpperCase());
+            buffer.append("\n");
+            buffer.append(getMeanSummary(metric).toString());
+            buffer.append("********************************************\n");
+            buffer.append("Overall statistics for the standard deviation ");
+            buffer.append(metric.toUpperCase());
+            buffer.append("\n");
+            buffer.append(getStdSummary(metric).toString());
+            buffer.append("********************************************\n");
+            buffer.append("Overall statistics for the min ");
+            buffer.append(metric.toUpperCase());
+            buffer.append("\n");
+            buffer.append(getMinSummary(metric).toString());
+            buffer.append("********************************************\n");
+            buffer.append("Overall statistics for the max ");
+            buffer.append(metric.toUpperCase());
+            buffer.append("\n");
+            buffer.append(getMaxSummary(metric).toString());
+            buffer.append("********************************************\n");
+        } 
+        return buffer.toString();
+    }
+    
+    /**
+     * Displays statistics for the given process
+     * 
+     * @param process the process to retrieve metrics for
+     * @return String representing all currently defined statistics for the
+     * given process
+     */
+    public synchronized String displayProcessStatistics(String process) {
+        Iterator<String> metricsIterator = getTypes().iterator();
+        StringBuffer buffer = new StringBuffer();
+        while (metricsIterator.hasNext()) {
+            String metric = metricsIterator.next();
+            buffer.append("*********************************************\n");
+            buffer.append(metric.toUpperCase());
+            buffer.append(" for ");
+            buffer.append(process);
+            buffer.append(getStatistics(process, metric).toString());
+            buffer.append("\n********************************************\n");
+        }
+        return buffer.toString();
+    }
+    
+    /**
      * Composite key (<process,type>).
      */
     private static class StatisticsKey {
@@ -225,8 +305,8 @@
                 return false;
             } else {
                 StatisticsKey other = (StatisticsKey) obj;
-                return other.process == this.process &&
-                    other.type == this.type;  
+                return (other.process.equals(this.process)) &&
+                    (other.type.equals(this.type));  
             }
         }
         public int hashCode() {