From f92107b43c108c6f7043f003ec31bb14c158d8ca Mon Sep 17 00:00:00 2001 From: ulfjack Date: Fri, 8 Jun 2018 14:14:05 -0700 Subject: Clean up Profiler a bit PiperOrigin-RevId: 199849102 --- .../devtools/build/lib/profiler/Profiler.java | 65 +++++++--------- .../devtools/build/lib/profiler/ProfilerTask.java | 82 +++++++++++---------- .../build/lib/profiler/analysis/ProfileInfo.java | 86 +--------------------- .../profiler/chart/AggregatingChartCreator.java | 7 +- .../lib/profiler/output/CriticalPathHtml.java | 5 -- .../lib/profiler/output/CriticalPathText.java | 4 - .../build/lib/profiler/output/PhaseHtml.java | 4 +- .../build/lib/profiler/output/PhaseText.java | 5 +- .../statistics/CriticalPathStatistics.java | 15 +--- .../devtools/build/lib/runtime/BlazeRuntime.java | 15 +++- 10 files changed, 88 insertions(+), 200 deletions(-) (limited to 'src/main/java/com') diff --git a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java index 98fc311ed2..69da2de947 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java @@ -188,29 +188,28 @@ public final class Profiler { @ThreadCompatible private final class TaskData { final long threadId; - final long startTime; - long duration = 0L; + final long startTimeNanos; final int id; final int parentId; - int[] counts; // number of invocations per ProfilerTask type - long[] durations; // time spend in the task per ProfilerTask type final ProfilerTask type; final String description; - TaskData(long startTime, TaskData parent, ProfilerTask eventType, String description) { + long duration; + int[] counts; // number of invocations per ProfilerTask type + long[] durations; // time spend in the task per ProfilerTask type + + TaskData(long startTimeNanos, TaskData parent, ProfilerTask eventType, String description) { threadId = Thread.currentThread().getId(); counts = null; durations = null; id = taskId.incrementAndGet(); parentId = (parent == null ? 0 : parent.id); - this.startTime = startTime; + this.startTimeNanos = startTimeNanos; this.type = eventType; this.description = Preconditions.checkNotNull(description); } - /** - * Aggregates information about an *immediate* subtask. - */ + /** Aggregates information about an *immediate* subtask. */ public void aggregateChild(ProfilerTask type, long duration) { int index = type.ordinal(); if (counts == null) { @@ -266,8 +265,8 @@ public final class Profiler { get().add(create(clock.nanoTime(), eventType, description)); } - public TaskData create(long startTime, ProfilerTask eventType, String description) { - return new TaskData(startTime, peek(), eventType, description); + public TaskData create(long startTimeNanos, ProfilerTask eventType, String description) { + return new TaskData(startTimeNanos, peek(), eventType, description); } @Override @@ -506,9 +505,14 @@ public final class Profiler { * @param clock a {@code BlazeClock.instance()} * @param execStartTimeNanos execution start time in nanos obtained from {@code clock.nanoTime()} */ - public synchronized void start(ProfiledTaskKinds profiledTaskKinds, OutputStream stream, - String comment, boolean recordAllDurations, Clock clock, long execStartTimeNanos) - throws IOException { + public synchronized void start( + ProfiledTaskKinds profiledTaskKinds, + OutputStream stream, + String comment, + boolean recordAllDurations, + Clock clock, + long execStartTimeNanos) + throws IOException { Preconditions.checkState(!isActive(), "Profiler already active"); taskStack = new TaskStack(); taskQueue = new ConcurrentLinkedQueue<>(); @@ -625,14 +629,14 @@ public final class Profiler { try { // Allocate the sink once to avoid GC ByteBuffer sink = ByteBuffer.allocate(1024); - while (!taskQueue.isEmpty()) { + TaskData data; + while ((data = taskQueue.poll()) != null) { sink.clear(); - TaskData data = taskQueue.poll(); VarInt.putVarLong(data.threadId, sink); VarInt.putVarInt(data.id, sink); VarInt.putVarInt(data.parentId, sink); - VarInt.putVarLong(data.startTime - profileStartTime, sink); + VarInt.putVarLong(data.startTimeNanos - profileStartTime, sink); VarInt.putVarLong(data.duration, sink); // To save space (and improve performance), convert all description @@ -700,14 +704,14 @@ public final class Profiler { * Adds task directly to the main queue bypassing task stack. Used for simple tasks that are known * to not have any subtasks. * - * @param startTime task start time (obtained through {@link Profiler#nanoTimeMaybe()}) + * @param startTimeNanos task start time (obtained through {@link Profiler#nanoTimeMaybe()}) * @param duration task duration * @param type task type * @param description task description. May be stored until end of build. */ - private void logTask(long startTime, long duration, ProfilerTask type, String description) { + private void logTask(long startTimeNanos, long duration, ProfilerTask type, String description) { Preconditions.checkNotNull(description); - Preconditions.checkState(startTime > 0, "startTime was %s", startTime); + Preconditions.checkState(startTimeNanos > 0, "startTime was %s", startTimeNanos); if (duration < 0) { // See note in Clock#nanoTime, which is used by Profiler#nanoTimeMaybe. duration = 0; @@ -729,7 +733,7 @@ public final class Profiler { parent.aggregateChild(type, duration); } if (wasTaskSlowEnoughToRecord(type, duration)) { - TaskData data = localStack.create(startTime, type, description); + TaskData data = localStack.create(startTimeNanos, type, description); data.duration = duration; if (out != null) { localQueue.add(data); @@ -795,7 +799,7 @@ public final class Profiler { } /** Used to log "events" - tasks with zero duration. */ - public void logEvent(ProfilerTask type, String description) { + void logEvent(ProfilerTask type, String description) { if (isActive() && isProfiling(type)) { logTask(clock.nanoTime(), 0, type, description); } @@ -842,7 +846,7 @@ public final class Profiler { type, data, taskStack); - data.duration = endTime - data.startTime; + data.duration = endTime - data.startTimeNanos; if (data.parentId > 0) { taskStack.peek().aggregateChild(data.type, data.duration); } @@ -869,19 +873,4 @@ public final class Profiler { logEvent(ProfilerTask.PHASE, phase.description); } } - - /** - * Convenience method to log spawn tasks. - * - * TODO(bazel-team): Right now method expects single string of the spawn action - * as task description (usually either argv[0] or a name of the main executable - * in case of complex shell commands). Maybe it should accept Command object - * and create more user friendly description. - */ - public void logSpawn(long startTime, String arg0) { - if (isActive() && isProfiling(ProfilerTask.SPAWN)) { - logTask(startTime, clock.nanoTime() - startTime, ProfilerTask.SPAWN, arg0); - } - } - } diff --git a/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java b/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java index 8f7e3d1693..39c9c866dc 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/ProfilerTask.java @@ -26,25 +26,25 @@ public enum ProfilerTask { * Add new Tasks at the end (before Unknown) to not break the profiles that people have created! * The profile file format uses the ordinal() of this enumeration to identify the task. */ - PHASE("build phase marker", -1, 0x336699, 0), - ACTION("action processing", -1, 0x666699, 0), - ACTION_BUILDER("parallel builder completion queue", -1, 0xCC3399, 0), - ACTION_SUBMIT("execution queue submission", -1, 0xCC3399, 0), + PHASE("build phase marker", 0x336699), + ACTION("action processing", 0x666699), + __ACTION_BUILDER("parallel builder completion queue", 0xCC3399), // unused + __ACTION_SUBMIT("execution queue submission", 0xCC3399), // unused ACTION_CHECK("action dependency checking", 10000000, 0x999933, 0), - ACTION_EXECUTE("action execution", -1, 0x99CCFF, 0), + ACTION_EXECUTE("action execution", 0x99CCFF), ACTION_LOCK("action resource lock", 10000000, 0xCC9933, 0), ACTION_RELEASE("action resource release", 10000000, 0x006666, 0), - ACTION_GRAPH("action graph dependency", -1, 0x3399FF, 0), + __ACTION_GRAPH("action graph dependency", 0x3399FF), // unused ACTION_UPDATE("update action information", 10000000, 0x993300, 0), - ACTION_COMPLETE("complete action execution", -1, 0xCCCC99, 0), - INFO("general information", -1, 0x000066, 0), - EXCEPTION("exception", -1, 0xFFCC66, 0), - CREATE_PACKAGE("package creation", -1, 0x6699CC, 0), - PACKAGE_VALIDITY_CHECK("package validity check", -1, 0x336699, 0), - SPAWN("local process spawn", -1, 0x663366, 0), - REMOTE_EXECUTION("remote action execution", -1, 0x9999CC, 0), - LOCAL_EXECUTION("local action execution", -1, 0xCCCCCC, 0), - SCANNER("include scanner", -1, 0x669999, 0), + ACTION_COMPLETE("complete action execution", 0xCCCC99), + INFO("general information", 0x000066), + __EXCEPTION("exception", 0xFFCC66), // unused + CREATE_PACKAGE("package creation", 0x6699CC), + __PACKAGE_VALIDITY_CHECK("package validity check", 0x336699), // unused + __SPAWN("local process spawn", 0x663366), // unused + REMOTE_EXECUTION("remote action execution", 0x9999CC), + LOCAL_EXECUTION("local action execution", 0xCCCCCC), + SCANNER("include scanner", 0x669999), // 30 is a good number because the slowest items are stored in a heap, with temporarily // one more element, and with 31 items, a heap becomes a complete binary tree LOCAL_PARSE("Local parse to prepare for remote execution", 50000000, 0x6699CC, 30), @@ -68,36 +68,38 @@ public enum ProfilerTask { VFS_VMFS_DIR("VMFS readdir", 10000000, 0x0066CC, 0, true), VFS_VMFS_READ("VMFS read", 10000000, 0x99CC33, 0, true), WAIT("thread wait", 5000000, 0x66CCCC, 0), - CONFIGURED_TARGET("configured target creation", -1, 0x663300, 0), - TRANSITIVE_CLOSURE("transitive closure creation", -1, 0x996600, 0), - TEST("for testing only", -1, 0x000000, 0), - SKYFRAME_EVAL("skyframe evaluator", -1, 0xCC9900, 0), - SKYFUNCTION("skyfunction", -1, 0xCC6600, 0), - CRITICAL_PATH("critical path", -1, 0x666699, 0), - CRITICAL_PATH_COMPONENT("critical path component", -1, 0x666699, 0), - HANDLE_GC_NOTIFICATION("gc notification", -1, 0x996633, 0), - INCLUSION_LOOKUP("inclusion lookup", -1, 0x000000, 0), - INCLUSION_PARSE("inclusion parse", -1, 0x000000, 0), - PROCESS_SCAN("process scan", -1, 0x000000, 0), - LOOP_OUTPUT_ARTIFACTS("loop output artifacts"), - LOCATE_RELATIVE("locate relative"), - CONSTRUCT_INCLUDE_PATHS("construct include paths"), - PARSE_AND_HINTS_RESULTS("parse and hints results"), - PROCESS_RESULTS_AND_ENQUEUE("process results and enqueue"), + __CONFIGURED_TARGET("configured target creation", 0x663300), // unused + __TRANSITIVE_CLOSURE("transitive closure creation", 0x996600), // unused + __TEST("for testing only", 0x000000), // unused + SKYFRAME_EVAL("skyframe evaluator", 0xCC9900), + SKYFUNCTION("skyfunction", 0xCC6600), + CRITICAL_PATH("critical path", 0x666699), + CRITICAL_PATH_COMPONENT("critical path component", 0x666699), + HANDLE_GC_NOTIFICATION("gc notification", 0x996633), + __INCLUSION_LOOKUP("inclusion lookup", 0x000000), // unused + __INCLUSION_PARSE("inclusion parse", 0x000000), // unused + __PROCESS_SCAN("process scan", 0x000000), // unused + __LOOP_OUTPUT_ARTIFACTS("loop output artifacts"), // unused + __LOCATE_RELATIVE("locate relative"), // unused + __CONSTRUCT_INCLUDE_PATHS("construct include paths"), // unused + __PARSE_AND_HINTS_RESULTS("parse and hints results"), // unused + __PROCESS_RESULTS_AND_ENQUEUE("process results and enqueue"), // unused SKYLARK_PARSER("Skylark Parser"), - SKYLARK_USER_FN("Skylark user function call", -1, 0xCC0033, 0), - SKYLARK_BUILTIN_FN("Skylark builtin function call", -1, 0x990033, 0), - SKYLARK_USER_COMPILED_FN("Skylark compiled user function call", -1, 0xCC0033, 0), - ACTION_FS_STAGING("Staging per-action file system", -1, 0x000000, 0), - UNKNOWN("Unknown event", -1, 0x339966, 0); + SKYLARK_USER_FN("Skylark user function call", -0xCC0033), + SKYLARK_BUILTIN_FN("Skylark builtin function call", 0x990033), + SKYLARK_USER_COMPILED_FN("Skylark compiled user function call", 0xCC0033), + ACTION_FS_STAGING("Staging per-action file system", 0x000000), + UNKNOWN("Unknown event", 0x339966); // Size of the ProfilerTask value space. public static final int TASK_COUNT = ProfilerTask.values().length; /** Human readable description for the task. */ public final String description; - /** Threshold for skipping tasks in the profile in nanoseconds, unless --record_full_profiler_data - * is used */ + /** + * Threshold for skipping tasks in the profile in nanoseconds, unless --record_full_profiler_data + * is used. + */ public final long minDuration; /** Default color of the task, when rendered in a chart. */ public final int color; @@ -106,6 +108,10 @@ public enum ProfilerTask { /** True if the metric records VFS operations */ private final boolean vfs; + ProfilerTask(String description, int color) { + this(description, /* minDuration= */ -1, color, /* slowestInstanceCount= */ 0, /*vfs=*/ false); + } + ProfilerTask(String description, long minDuration, int color, int slowestInstanceCount) { this(description, minDuration, color, slowestInstanceCount, /*vfs=*/ false); } diff --git a/src/main/java/com/google/devtools/build/lib/profiler/analysis/ProfileInfo.java b/src/main/java/com/google/devtools/build/lib/profiler/analysis/ProfileInfo.java index 88cb5b8071..6104674086 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/analysis/ProfileInfo.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/analysis/ProfileInfo.java @@ -448,7 +448,6 @@ public class ProfileInfo { // TODO(bazel-team): (2010) In one case, this list took 277MB of heap. Ideally it should be // replaced with a trie. private final List descriptionList; - private final Map parallelBuilderCompletionQueueTasks; public final Map tasksByThread; public final List allTasksById; public List rootTasksById; // Not final due to the late initialization. @@ -468,7 +467,6 @@ public class ProfileInfo { descriptionList = Lists.newArrayListWithExpectedSize(10000); tasksByThread = Maps.newHashMap(); - parallelBuilderCompletionQueueTasks = Maps.newHashMap(); allTasksById = Lists.newArrayListWithExpectedSize(50000); phaseTasks = Lists.newArrayList(); actionDependencyMap = Maps.newHashMapWithExpectedSize(10000); @@ -681,43 +679,6 @@ public class ProfileInfo { return duration; } - - /** - * Builds map of dependencies between ACTION tasks based on dependencies - * between ACTION_GRAPH tasks - */ - private Task buildActionTaskTree(Task actionGraphTask, List actionTasksByDescription) { - Task actionTask = actionGraphTask.relatedTask; - if (actionTask == null) { - actionTask = actionTasksByDescription.get(actionGraphTask.descIndex); - if (actionTask == null) { - // If we cannot find ACTION task that corresponds to the ACTION_GRAPH task, - // most likely scenario is that we dealing with either aborted or failed - // build. In this case we will find or create fake zero-duration action - // task and still reconstruct dependency graph. - actionTask = new Task(-1, --fakeActionId, 0, 0, 0, - ProfilerTask.ACTION, actionGraphTask.descIndex, new CompactStatistics((byte[]) null)); - actionTask.calculateRootStats(); - actionTasksByDescription.set(actionGraphTask.descIndex, actionTask); - } - actionGraphTask.relatedTask = actionTask; - } - if (actionGraphTask.subtasks.length != 0) { - List list = Lists.newArrayListWithCapacity(actionGraphTask.subtasks.length); - for (Task task : actionGraphTask.subtasks) { - if (task.type == ProfilerTask.ACTION_GRAPH) { - list.add(buildActionTaskTree(task, actionTasksByDescription)); - } - } - if (!list.isEmpty()) { - Task[] actionPrerequisites = list.toArray(new Task[list.size()]); - Arrays.sort(actionPrerequisites); - actionDependencyMap.put(actionTask, actionPrerequisites); - } - } - return actionTask; - } - /** * Builds map of dependencies between ACTION tasks based on dependencies * between ACTION_GRAPH tasks. Root of that dependency tree would be @@ -740,32 +701,9 @@ public class ProfileInfo { } } List list = new ArrayList<>(); - for (Task task : getTasksForPhase(analysisPhaseTask)) { - if (task.type == ProfilerTask.ACTION_GRAPH) { - list.add(buildActionTaskTree(task, actionTasksByDescription)); - } - } Task[] actionPrerequisites = list.toArray(new Task[list.size()]); Arrays.sort(actionPrerequisites); actionDependencyMap.put(executionPhaseTask, actionPrerequisites); - - // Scan through all execution phase tasks to identify ACTION_SUBMIT tasks and associate - // them with ACTION task counterparts. ACTION_SUBMIT tasks are not necessarily root - // tasks so we need to scan ALL tasks. - for (Task task : allTasksById.subList(executionPhaseTask.id, allTasksById.size())) { - if (task.type == ProfilerTask.ACTION_SUBMIT) { - Task actionTask = actionTasksByDescription.get(task.descIndex); - if (actionTask != null) { - task.relatedTask = actionTask; - actionTask.relatedTask = task; - } - } else if (task.type == ProfilerTask.ACTION_BUILDER) { - Task actionTask = actionTasksByDescription.get(task.descIndex); - if (actionTask != null) { - parallelBuilderCompletionQueueTasks.put(actionTask, task); - } - } - } } /** @@ -903,19 +841,7 @@ public class ProfileInfo { * ACTION task start time and ACTION_SUBMIT task start time). */ public long getActionWaitTime(Task actionTask) { - // Light critical path does not record wait time. - if (actionTask.type == ProfilerTask.CRITICAL_PATH_COMPONENT) { - return 0; - } - Preconditions.checkArgument(actionTask.type == ProfilerTask.ACTION); - if (actionTask.relatedTask != null) { - Preconditions.checkState(actionTask.relatedTask.type == ProfilerTask.ACTION_SUBMIT); - long time = actionTask.startTime - actionTask.relatedTask.startTime; - Preconditions.checkState(time >= 0); - return time; - } else { - return 0L; // submission time is not available. - } + return 0L; // submission time is not available. } /** @@ -928,15 +854,7 @@ public class ProfileInfo { return 0; } Preconditions.checkArgument(actionTask.type == ProfilerTask.ACTION); - Task related = parallelBuilderCompletionQueueTasks.get(actionTask); - if (related != null) { - Preconditions.checkState(related.type == ProfilerTask.ACTION_BUILDER); - long time = related.startTime - (actionTask.startTime + actionTask.durationNanos); - Preconditions.checkState(time >= 0); - return time; - } else { - return 0L; // queue task is not available. - } + return 0L; // queue task is not available. } /** diff --git a/src/main/java/com/google/devtools/build/lib/profiler/chart/AggregatingChartCreator.java b/src/main/java/com/google/devtools/build/lib/profiler/chart/AggregatingChartCreator.java index b6d66eb1b6..30f0e3a9a5 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/chart/AggregatingChartCreator.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/chart/AggregatingChartCreator.java @@ -38,17 +38,12 @@ import java.util.Set; public class AggregatingChartCreator implements ChartCreator { /** The tasks in the 'actions' category. */ - private static final Set ACTION_TASKS = EnumSet.of(ProfilerTask.ACTION, - ProfilerTask.ACTION_SUBMIT); + private static final Set ACTION_TASKS = EnumSet.of(ProfilerTask.ACTION); /** The tasks in the 'blaze internal' category. */ private static final Set BLAZE_TASKS = EnumSet.of( ProfilerTask.CREATE_PACKAGE, - ProfilerTask.PACKAGE_VALIDITY_CHECK, - ProfilerTask.CONFIGURED_TARGET, - ProfilerTask.TRANSITIVE_CLOSURE, - ProfilerTask.EXCEPTION, ProfilerTask.INFO, ProfilerTask.UNKNOWN); diff --git a/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathHtml.java b/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathHtml.java index 101a27e27e..4d1cd83175 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathHtml.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathHtml.java @@ -57,11 +57,6 @@ public final class CriticalPathHtml extends HtmlPrinter { element("td", "colspan", "4", totalPath.task.type); close(); - lnOpen("tr"); - element("td", "colspan", "3", "Worker thread scheduling delays"); - element("td", TimeUtilities.prettyTime(criticalPathStats.getWorkerWaitTime())); - close(); // tr - lnOpen("tr"); element("td", "colspan", "3", "Main thread scheduling delays"); element("td", TimeUtilities.prettyTime(criticalPathStats.getMainThreadWaitTime())); diff --git a/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathText.java b/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathText.java index bf1053551d..3236935d30 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathText.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/output/CriticalPathText.java @@ -52,10 +52,6 @@ public final class CriticalPathText extends TextPrinter { CriticalPathEntry totalPath, CriticalPathEntry optimalPath) { lnPrint(totalPath.task.type); - lnPrintf( - TWO_COLUMN_FORMAT, - "Worker thread scheduling delays", - TimeUtilities.prettyTime(criticalPathStats.getWorkerWaitTime())); lnPrintf( TWO_COLUMN_FORMAT, "Main thread scheduling delays", diff --git a/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseHtml.java b/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseHtml.java index 1184b221f8..a6dcecc680 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseHtml.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseHtml.java @@ -162,10 +162,8 @@ public final class PhaseHtml extends HtmlPrinter { } } - long graphTime = execPhase.getTotalDurationNanos(ProfilerTask.ACTION_GRAPH); - long execTime = execPhase.getPhaseDurationNanos() - graphTime; + long execTime = execPhase.getPhaseDurationNanos(); - printTwoColumnStatistic("Action dependency map creation", graphTime); printTwoColumnStatistic("Actual execution time", execTime); CriticalPathHtml criticalPaths = null; diff --git a/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseText.java b/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseText.java index 71be9dca4c..5f1d42b28b 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseText.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/output/PhaseText.java @@ -122,8 +122,7 @@ public final class PhaseText extends TextPrinter { } lnPrint("=== EXECUTION PHASE INFORMATION ===\n"); - long graphTime = execPhase.getTotalDurationNanos(ProfilerTask.ACTION_GRAPH); - long execTime = execPhase.getPhaseDurationNanos() - graphTime; + long execTime = execPhase.getPhaseDurationNanos(); if (prepPhase.wasExecuted()) { lnPrintf( @@ -142,8 +141,6 @@ public final class PhaseText extends TextPrinter { TimeUtilities.prettyTime(finishPhase.getPhaseDurationNanos())); } printLn(); - lnPrintf( - TWO_COLUMN_FORMAT, "Action dependency map creation", TimeUtilities.prettyTime(graphTime)); lnPrintf(TWO_COLUMN_FORMAT, "Actual execution time", TimeUtilities.prettyTime(execTime)); CriticalPathText criticalPaths = null; diff --git a/src/main/java/com/google/devtools/build/lib/profiler/statistics/CriticalPathStatistics.java b/src/main/java/com/google/devtools/build/lib/profiler/statistics/CriticalPathStatistics.java index 4c6f87cb6e..6498192e57 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/statistics/CriticalPathStatistics.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/statistics/CriticalPathStatistics.java @@ -56,7 +56,7 @@ public final class CriticalPathStatistics implements Iterable