]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4147 Add breakdown by module to profiling
authorJulien HENRY <julien.henry@sonarsource.com>
Thu, 18 Apr 2013 14:41:58 +0000 (16:41 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 18 Apr 2013 14:41:58 +0000 (16:41 +0200)
sonar-batch/src/main/java/org/sonar/batch/profiling/AbstractTimeProfiling.java
sonar-batch/src/main/java/org/sonar/batch/profiling/ModuleProfiling.java
sonar-batch/src/main/java/org/sonar/batch/profiling/PhaseProfiling.java
sonar-batch/src/main/java/org/sonar/batch/profiling/PhasesSumUpTimeProfiler.java

index 51a5d2637021ef253574d44c34131eedcd246a1e..f0b8057703dccbf5fe94a62fee8cba12294b57ce 100644 (file)
@@ -64,7 +64,7 @@ public abstract class AbstractTimeProfiling {
     this.setTotalTime(this.totalTime() + other.totalTime());
   }
 
-  protected <G extends AbstractTimeProfiling> List<G> sortByDescendingTotalTime(Collection<G> unsorted) {
+  static <G extends AbstractTimeProfiling> List<G> sortByDescendingTotalTime(Collection<G> unsorted) {
     List<G> result = new ArrayList<G>(unsorted.size());
     result.addAll(unsorted);
     Collections.sort(result, new Comparator<G>() {
@@ -76,4 +76,19 @@ public abstract class AbstractTimeProfiling {
     return result;
   }
 
+  static <G extends AbstractTimeProfiling> List<G> truncate(Collection<G> sortedList) {
+    int maxSize = 10;
+    List<G> result = new ArrayList<G>(maxSize);
+    int i = 0;
+    for (G item : sortedList) {
+      if (i++ >= maxSize || item.totalTime() == 0) {
+        return result;
+      }
+      else {
+        result.add(item);
+      }
+    }
+    return result;
+  }
+
 }
index 895624b9db58b6d49a2ad3a22f8a16a05c0338f7..cb656d07ac8dfdcdb989d6cf431aa0f33c022852 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.batch.profiling;
 
+import org.sonar.api.resources.Project;
 import org.sonar.api.utils.TimeUtils;
 import org.sonar.batch.phases.Phases;
 import org.sonar.batch.phases.Phases.Phase;
@@ -31,12 +32,21 @@ public class ModuleProfiling extends AbstractTimeProfiling {
 
   private Map<Phases.Phase, PhaseProfiling> profilingPerPhase = new HashMap<Phases.Phase, PhaseProfiling>();
   private Clock clock;
+  private Project module;
 
-  public ModuleProfiling(Clock clock) {
+  public ModuleProfiling(Project module, Clock clock) {
     super(clock);
+    this.module = module;
     this.clock = clock;
   }
 
+  public String moduleName() {
+    if (module != null) {
+      return module.getName();
+    }
+    return null;
+  }
+
   public PhaseProfiling getProfilingPerPhase(Phase phase) {
     return profilingPerPhase.get(phase);
   }
index 46566b70991231c0351f8ce18fdd392ffa213eab..cb9d4d7dd2533a44175712e7a9d02c4bf45de9b4 100644 (file)
@@ -21,9 +21,7 @@ package org.sonar.batch.profiling;
 
 import org.sonar.batch.phases.Phases.Phase;
 
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -75,7 +73,7 @@ public class PhaseProfiling extends AbstractTimeProfiling {
 
   public void dump() {
     double percent = this.totalTime() / 100.0;
-    for (ItemProfiling itemProfiling : truncateList(sortByDescendingTotalTime(profilingPerItem.values()))) {
+    for (ItemProfiling itemProfiling : truncate(sortByDescendingTotalTime(profilingPerItem.values()))) {
       StringBuilder sb = new StringBuilder();
       sb.append("   o ").append(itemProfiling.itemName()).append(": ").append(itemProfiling.totalTimeAsString())
           .append(" (").append((int) (itemProfiling.totalTime() / percent)).append("%)");
@@ -96,19 +94,4 @@ public class PhaseProfiling extends AbstractTimeProfiling {
     return toString;
   }
 
-  private List<ItemProfiling> truncateList(List<ItemProfiling> sortedFullList) {
-    int maxSize = 10;
-    List<ItemProfiling> result = new ArrayList<ItemProfiling>(maxSize);
-    int i = 0;
-    for (ItemProfiling item : sortedFullList) {
-      if (i++ >= maxSize || item.totalTime() == 0) {
-        return result;
-      }
-      else {
-        result.add(item);
-      }
-    }
-    return result;
-  }
-
 }
index 2690aff2cd06b9e69bab5519d60de1dcaaab4b1a..e2ca60cb7cf1faa8d273a732a6300762d3bc98ee 100644 (file)
@@ -33,10 +33,14 @@ import org.sonar.api.resources.Project;
 import org.sonar.api.utils.TimeUtils;
 import org.sonar.batch.phases.Phases;
 
+import java.util.ArrayList;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
 
+import static org.sonar.batch.profiling.AbstractTimeProfiling.sortByDescendingTotalTime;
+import static org.sonar.batch.profiling.AbstractTimeProfiling.truncate;
+
 public class PhasesSumUpTimeProfiler implements ProjectAnalysisHandler, SensorExecutionHandler, DecoratorExecutionHandler, PostJobExecutionHandler, DecoratorsPhaseHandler,
     SensorsPhaseHandler, PostJobsPhaseHandler {
 
@@ -44,6 +48,7 @@ public class PhasesSumUpTimeProfiler implements ProjectAnalysisHandler, SensorEx
   ModuleProfiling currentModuleProfiling;
   @VisibleForTesting
   ModuleProfiling totalProfiling;
+  private List<ModuleProfiling> modulesProfilings = new ArrayList<ModuleProfiling>();
   private DecoratorsProfiler decoratorsProfiler;
 
   private Clock clock;
@@ -55,7 +60,7 @@ public class PhasesSumUpTimeProfiler implements ProjectAnalysisHandler, SensorEx
   @VisibleForTesting
   PhasesSumUpTimeProfiler(Clock clock) {
     this.clock = clock;
-    totalProfiling = new ModuleProfiling(clock);
+    totalProfiling = new ModuleProfiling(null, clock);
   }
 
   @Override
@@ -63,25 +68,39 @@ public class PhasesSumUpTimeProfiler implements ProjectAnalysisHandler, SensorEx
     Project module = event.getProject();
     if (event.isStart()) {
       decoratorsProfiler = new DecoratorsProfiler();
-      currentModuleProfiling = new ModuleProfiling(clock);
+      currentModuleProfiling = new ModuleProfiling(module, clock);
     }
     else {
       currentModuleProfiling.stop();
+      modulesProfilings.add(currentModuleProfiling);
       long moduleTotalTime = currentModuleProfiling.totalTime();
       System.out.println("\n -------- Profiling of module " + module.getName() + ": " + TimeUtils.formatDuration(moduleTotalTime) + " --------\n");
       currentModuleProfiling.dump();
       System.out.println("\n -------- End of profiling of module " + module.getName() + " --------\n");
       totalProfiling.merge(currentModuleProfiling);
       if (module.isRoot() && !module.getModules().isEmpty()) {
-        totalProfiling.stop();
-        long totalTime = totalProfiling.totalTime();
-        System.out.println("\n ======== Profiling of total execution: " + TimeUtils.formatDuration(totalTime) + " ========\n");
-        totalProfiling.dump();
-        System.out.println("\n ======== End of profiling of total execution ========\n");
+        dumpTotalExecutionSummary();
       }
     }
   }
 
+  private void dumpTotalExecutionSummary() {
+    totalProfiling.stop();
+    long totalTime = totalProfiling.totalTime();
+    System.out.println("\n ======== Profiling of total execution: " + TimeUtils.formatDuration(totalTime) + " ========\n");
+    System.out.println(" * Module execution time breakdown: ");
+    double percent = totalTime / 100.0;
+    for (ModuleProfiling modulesProfiling : truncate(sortByDescendingTotalTime(modulesProfilings))) {
+      StringBuilder sb = new StringBuilder();
+      sb.append("   o ").append(modulesProfiling.moduleName()).append(" execution time: ").append(modulesProfiling.totalTimeAsString())
+          .append(" (").append((int) (modulesProfiling.totalTime() / percent)).append("%)");
+      System.out.println(sb.toString());
+    }
+    System.out.println();
+    totalProfiling.dump();
+    System.out.println("\n ======== End of profiling of total execution ========\n");
+  }
+
   public void onSensorsPhase(SensorsPhaseEvent event) {
     if (event.isStart()) {
       currentModuleProfiling.addPhaseProfiling(Phases.Phase.SENSOR);