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>() {
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;
+ }
+
}
*/
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;
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);
}
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;
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("%)");
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;
- }
-
}
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 {
ModuleProfiling currentModuleProfiling;
@VisibleForTesting
ModuleProfiling totalProfiling;
+ private List<ModuleProfiling> modulesProfilings = new ArrayList<ModuleProfiling>();
private DecoratorsProfiler decoratorsProfiler;
private Clock clock;
@VisibleForTesting
PhasesSumUpTimeProfiler(Clock clock) {
this.clock = clock;
- totalProfiling = new ModuleProfiling(clock);
+ totalProfiling = new ModuleProfiling(null, clock);
}
@Override
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);