Repository: incubator-systemml
Updated Branches:
  refs/heads/master a6428f7d8 -> 0abb3db01


[SYSTEMML-1602] Improve formatting of heavy hitter output

Align heavy hitter instruction statistics in columns in tabular format.

Closes #496.


Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/0abb3db0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/0abb3db0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/0abb3db0

Branch: refs/heads/master
Commit: 0abb3db019c043b4bdb1918194417f03df336619
Parents: a6428f7
Author: Deron Eriksson <[email protected]>
Authored: Fri May 19 16:32:27 2017 -0700
Committer: Deron Eriksson <[email protected]>
Committed: Fri May 19 16:32:27 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/sysml/utils/Statistics.java | 93 +++++++++++++++-----
 1 file changed, 69 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/0abb3db0/src/main/java/org/apache/sysml/utils/Statistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/utils/Statistics.java 
b/src/main/java/org/apache/sysml/utils/Statistics.java
index 49633d8..808267d 100644
--- a/src/main/java/org/apache/sysml/utils/Statistics.java
+++ b/src/main/java/org/apache/sysml/utils/Statistics.java
@@ -22,6 +22,7 @@ package org.apache.sysml.utils;
 import java.lang.management.CompilationMXBean;
 import java.lang.management.GarbageCollectorMXBean;
 import java.lang.management.ManagementFactory;
+import java.text.DecimalFormat;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -504,42 +505,86 @@ public class Statistics
                return _cpInstCounts.get(opcode);
        }
 
+       /**
+        * Obtain a string tabular representation of the heavy hitter 
instructions
+        * that displays the time, instruction count, and optionally GPU stats 
about
+        * each instruction.
+        * 
+        * @param num
+        *            the maximum number of heavy hitters to display
+        * @return string representing the heavy hitter instructions in tabular
+        *         format
+        */
        @SuppressWarnings("unchecked")
-       public static String getHeavyHitters( int num )
-       {
+       public static String getHeavyHitters(int num) {
                int len = _cpInstTime.size();
-               if( num <= 0 || len <= 0 )
+               if (num <= 0 || len <= 0)
                        return "-";
-               
-               //get top k via sort
-               Entry<String,Long>[] tmp = _cpInstTime.entrySet().toArray(new 
Entry[len]);
+
+               // get top k via sort
+               Entry<String, Long>[] tmp = _cpInstTime.entrySet().toArray(new 
Entry[len]);
                Arrays.sort(tmp, new Comparator<Entry<String, Long>>() {
-                   public int compare(Entry<String, Long> e1, Entry<String, 
Long> e2) {
-                       return e1.getValue().compareTo(e2.getValue());
-                   }
+                       public int compare(Entry<String, Long> e1, 
Entry<String, Long> e2) {
+                               return e1.getValue().compareTo(e2.getValue());
+                       }
                });
-               
-               //prepare output string
+
+               final String numCol = "#";
+               final String instCol = "Instruction";
+               final String timeSCol = "Time(s)";
+               final String countCol = "Count";
+               final String gpuCol = "GPU";
                StringBuilder sb = new StringBuilder();
-               for( int i=0; i<Math.min(num, len); i++ ){
-                       String key = tmp[len-1-i].getKey();
-                       sb.append("-- "+(i+1)+") \t");
-                       sb.append(key);
-                       sb.append(" \t");
-                       sb.append(String.format("%.3f", 
((double)tmp[len-1-i].getValue())/1000000000));
-                       sb.append(" sec \t");
-                       sb.append(_cpInstCounts.get(key));
-                       sb.append("\t");
+               int numHittersToDisplay = Math.min(num, len);
+               int maxNumLen = String.valueOf(numHittersToDisplay).length();
+               int maxInstLen = instCol.length();
+               int maxTimeSLen = timeSCol.length();
+               int maxCountLen = countCol.length();
+               DecimalFormat sFormat = new DecimalFormat("#,##0.000");
+               for (int i = 0; i < numHittersToDisplay; i++) {
+                       Entry<String, Long> hh = tmp[len - 1 - i];
+                       String instruction = hh.getKey();
+                       Long timeNs = hh.getValue();
+                       double timeS = (double) timeNs / 1000000000.0;
+
+                       maxInstLen = Math.max(maxInstLen, instruction.length());
+
+                       String timeSString = sFormat.format(timeS);
+                       maxTimeSLen = Math.max(maxTimeSLen, 
timeSString.length());
+
+                       maxCountLen = Math.max(maxCountLen, 
String.valueOf(_cpInstCounts.get(instruction)).length());
+               }
+               sb.append(String.format(
+                               " %" + maxNumLen + "s  %-" + maxInstLen + "s  
%" + maxTimeSLen + "s  %" + maxCountLen + "s", numCol,
+                               instCol, timeSCol, countCol));
+               if (GPUStatistics.DISPLAY_STATISTICS) {
+                       sb.append("  ");
+                       sb.append(gpuCol);
+               }
+               sb.append("\n");
+               for (int i = 0; i < numHittersToDisplay; i++) {
+                       String instruction = tmp[len - 1 - i].getKey();
+
+                       Long timeNs = tmp[len - 1 - i].getValue();
+                       double timeS = (double) timeNs / 1000000000.0;
+                       String timeSString = sFormat.format(timeS);
+
+                       Long count = _cpInstCounts.get(instruction);
+                       sb.append(String.format(
+                                       " %" + maxNumLen + "d  %-" + maxInstLen 
+ "s  %" + maxTimeSLen + "s  %" + maxCountLen + "d",
+                                       (i + 1), instruction, timeSString, 
count));
+
                        // Add the miscellaneous timer info
                        if (GPUStatistics.DISPLAY_STATISTICS) {
-                               
sb.append(GPUStatistics.getStringForCPMiscTimesPerInstruction(key));
+                               sb.append("  ");
+                               
sb.append(GPUStatistics.getStringForCPMiscTimesPerInstruction(instruction));
                        }
                        sb.append("\n");
                }
-               
+
                return sb.toString();
        }
-       
+
        /**
         * Returns the total time of asynchronous JIT compilation in 
milliseconds.
         * 
@@ -715,7 +760,7 @@ public class Statistics
                        sb.append("Total JVM GC count:\t\t" + getJVMgcCount() + 
".\n");
                        sb.append("Total JVM GC time:\t\t" + 
((double)getJVMgcTime())/1000 + " sec.\n");
                        LibMatrixDNN.appendStatistics(sb);
-                       sb.append("Heavy hitter instructions (name, time, 
count):\n" + getHeavyHitters(maxHeavyHitters));
+                       sb.append("Heavy hitter instructions:\n" + 
getHeavyHitters(maxHeavyHitters));
                }
                
                return sb.toString();

Reply via email to