From d9b0cfd78efd2130fa24860fcb3e3f7a2170dbf4 Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 21 Feb 2024 06:08:57 -0800 Subject: [PATCH] Create less garbage for starlark profiles. PiperOrigin-RevId: 608967932 Change-Id: Ieddf6a986ca068dfa3b685986a2f7e6629df1889 --- .../build/lib/packages/PackageFactory.java | 17 +++++++++-------- .../devtools/build/lib/profiler/Profiler.java | 8 ++++++-- .../net/starlark/java/eval/StarlarkThread.java | 13 +++++++------ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index 31f0cbcd935943..37398aadd16679 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -563,19 +563,20 @@ public void end(Object span) { StarlarkThread.setCallProfiler( new StarlarkThread.CallProfiler() { @Override - public Object start(StarlarkCallable fn) { - return Profiler.instance() - .profile( + public long start() { + return Profiler.nanoTimeMaybe(); + } + + @Override + public void end(long startTimeNanos, StarlarkCallable fn) { + Profiler.instance() + .completeTask( + startTimeNanos, fn instanceof StarlarkFunction ? ProfilerTask.STARLARK_USER_FN : ProfilerTask.STARLARK_BUILTIN_FN, fn.getName()); } - - @Override - public void end(Object span) { - ((SilentCloseable) span).close(); - } }); } } 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 e790782f73ea8d..845bb3750f3865 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 @@ -74,6 +74,7 @@ * @see ProfilerTask enum for recognized task types. */ @ThreadSafe +@SuppressWarnings("GoodTime") // This code is very performance sensitive. public final class Profiler { /** The profiler (a static singleton instance). Inactive by default. */ private static final Profiler instance = new Profiler(); @@ -802,14 +803,17 @@ private boolean countAction(ProfilerTask type, TaskData taskData) { || (type == ProfilerTask.INFO && "discoverInputs".equals(taskData.description)); } + public void completeTask(long startTimeNanos, ProfilerTask type, String description) { + completeTask(Thread.currentThread().getId(), startTimeNanos, type, description); + } + /** Records the end of the task. */ private void completeTask( long laneId, long startTimeNanos, ProfilerTask type, String description) { if (isActive()) { long endTimeNanos = clock.nanoTime(); long duration = endTimeNanos - startTimeNanos; - boolean shouldRecordTask = wasTaskSlowEnoughToRecord(type, duration); - if (shouldRecordTask) { + if (wasTaskSlowEnoughToRecord(type, duration)) { recordTask(new TaskData(laneId, startTimeNanos, duration, type, description)); } } diff --git a/src/main/java/net/starlark/java/eval/StarlarkThread.java b/src/main/java/net/starlark/java/eval/StarlarkThread.java index fd9774933605ec..f4c202a2429d48 100644 --- a/src/main/java/net/starlark/java/eval/StarlarkThread.java +++ b/src/main/java/net/starlark/java/eval/StarlarkThread.java @@ -142,7 +142,7 @@ static final class Frame implements Debug.Frame { // values, or wrapped in StarlarkFunction.Cells if shared with a nested function. @Nullable Object[] locals; - @Nullable private Object profileSpan; // current span of walltime call profiler + private long profileStartTimeNanos; // start time nanos of walltime call profiler private Frame(StarlarkThread thread, StarlarkCallable fn) { this.thread = thread; @@ -237,7 +237,7 @@ void push(StarlarkCallable fn) { // Start wall-time call profile span. CallProfiler callProfiler = StarlarkThread.callProfiler; if (callProfiler != null) { - fr.profileSpan = callProfiler.start(fn); + fr.profileStartTimeNanos = callProfiler.start(); } // Poll for newly installed CPU profiler. @@ -277,8 +277,8 @@ void pop() { // End wall-time profile span. CallProfiler callProfiler = StarlarkThread.callProfiler; - if (callProfiler != null && fr.profileSpan != null) { - callProfiler.end(fr.profileSpan); + if (callProfiler != null && fr.profileStartTimeNanos >= 0) { + callProfiler.end(fr.profileStartTimeNanos, fr.fn); } // Notify debug tools of the thread's last pop. @@ -570,9 +570,10 @@ public String toString() { /** CallProfiler records the start and end wall times of function calls. */ public interface CallProfiler { - Object start(StarlarkCallable fn); + long start(); - void end(Object span); + @SuppressWarnings("GoodTime") // This code is very performance sensitive. + void end(long startTimeNanos, StarlarkCallable fn); } /** Installs a global hook that will be notified of function calls. */