aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
diff options
context:
space:
mode:
authorGravatar Miguel Alcon Pinto <malcon@google.com>2015-11-19 13:43:09 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-11-19 16:46:06 +0000
commit5f048979364f9c9dcad8a7c941f43865e27b227f (patch)
tree8b7063e39cc99345c2580b520c96cf853669893d /src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
parentb2519e049e4561caf89c51806b54a80f6a19d2fc (diff)
Record histogram and other statistics for the ProfileTask objects. In case of recording VFS_ stats we try to catalog the access base on the path type.
-- MOS_MIGRATED_REVID=108238357
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/profiler/Profiler.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/profiler/Profiler.java35
1 files changed, 35 insertions, 0 deletions
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 def46d8983..57ab3b0e58 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
@@ -16,7 +16,11 @@ package com.google.devtools.build.lib.profiler;
import static com.google.devtools.build.lib.profiler.ProfilerTask.TASK_COUNT;
import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.profiler.PredicateBasedStatRecorder.RecorderAndPredicate;
+import com.google.devtools.build.lib.profiler.StatRecorder.VfsHeuristics;
import com.google.devtools.build.lib.util.Clock;
import com.google.devtools.build.lib.util.VarInt;
@@ -29,11 +33,13 @@ import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
@@ -130,7 +136,10 @@ public final class Profiler {
*/
private static final Profiler instance = new Profiler();
+ private static final int HISTOGRAM_BUCKETS = 20;
+
/**
+ *
* A task that was very slow.
*/
public final class SlowTask implements Comparable<SlowTask> {
@@ -452,7 +461,10 @@ public final class Profiler {
private final SlowestTaskAggregator[] slowestTasks =
new SlowestTaskAggregator[ProfilerTask.values().length];
+ private final StatRecorder[] tasksHistograms = new StatRecorder[ProfilerTask.values().length];
+
private Profiler() {
+ initHistograms();
for (ProfilerTask task : ProfilerTask.values()) {
if (task.slowestInstancesCount != 0) {
slowestTasks[task.ordinal()] = new SlowestTaskAggregator(task.slowestInstancesCount);
@@ -460,6 +472,27 @@ public final class Profiler {
}
}
+ private void initHistograms() {
+ for (ProfilerTask task : ProfilerTask.values()) {
+ if (task.isVfs()) {
+ Map<String, ? extends Predicate<? super String>> vfsHeuristics =
+ VfsHeuristics.vfsTypeHeuristics;
+ List<RecorderAndPredicate> recorders = new ArrayList<>(vfsHeuristics.size());
+ for (Entry<String, ? extends Predicate<? super String>> e : vfsHeuristics.entrySet()) {
+ recorders.add(new RecorderAndPredicate(
+ new SingleStatRecorder(task + " " + e.getKey(), HISTOGRAM_BUCKETS), e.getValue()));
+ }
+ tasksHistograms[task.ordinal()] = new PredicateBasedStatRecorder(recorders);
+ } else {
+ tasksHistograms[task.ordinal()] = new SingleStatRecorder(task, HISTOGRAM_BUCKETS);
+ }
+ }
+ }
+
+ public ImmutableList<StatRecorder> getTasksHistograms() {
+ return ImmutableList.copyOf(tasksHistograms);
+ }
+
public static Profiler instance() {
return instance;
}
@@ -659,6 +692,7 @@ public final class Profiler {
}
private synchronized void clear() {
+ initHistograms();
profileStartTime = 0L;
if (timer != null) {
timer.cancel();
@@ -698,6 +732,7 @@ public final class Profiler {
duration = 0;
}
+ tasksHistograms[type.ordinal()].addStat((int) TimeUnit.NANOSECONDS.toMillis(duration), object);
TaskData parent = taskStack.peek();
if (parent != null) {
parent.aggregateChild(type, duration);