Add profiler warmup overhead tracking and tooltip display
This commit is contained in:
@@ -434,6 +434,7 @@ public static class Profiler
|
||||
public int ManagedThreadId { get; private set; }
|
||||
public List<ScopeNode> Children { get; } = new List<ScopeNode>();
|
||||
public long AllocatedBytes { get; private set; }
|
||||
public long ProfilerSetupBytes { get; private set; }
|
||||
internal ScopeNode Parent { get; private set; }
|
||||
internal long ChildrenDurationTicks { get; private set; }
|
||||
internal long ChildrenAllocatedBytes { get; private set; }
|
||||
@@ -451,6 +452,7 @@ public static class Profiler
|
||||
ChildrenDurationTicks = 0;
|
||||
ChildrenAllocatedBytes = 0;
|
||||
AllocatedBytes = 0;
|
||||
ProfilerSetupBytes = 0;
|
||||
Children.Clear();
|
||||
allocatedBytesAtStart = GC.GetAllocatedBytesForCurrentThread();
|
||||
}
|
||||
@@ -463,9 +465,11 @@ public static class Profiler
|
||||
}
|
||||
|
||||
EndTime = Stopwatch.GetTimestamp();
|
||||
AllocatedBytes = Math.Max(0, GC.GetAllocatedBytesForCurrentThread() - allocatedBytesAtStart);
|
||||
if (Parent != null)
|
||||
{
|
||||
// Root nodes are ended from FinalizeCurrentFrame on the main thread, so their
|
||||
// GC counter would be from the wrong thread. Only track alloc on non-root nodes.
|
||||
AllocatedBytes = Math.Max(0, GC.GetAllocatedBytesForCurrentThread() - allocatedBytesAtStart);
|
||||
Parent.ChildrenDurationTicks += Math.Max(0, EndTime - StartTime);
|
||||
Parent.ChildrenAllocatedBytes += AllocatedBytes;
|
||||
}
|
||||
@@ -488,6 +492,12 @@ public static class Profiler
|
||||
return Math.Max(0, AllocatedBytes - ChildrenAllocatedBytes);
|
||||
}
|
||||
|
||||
// Called after all profiler setup (Children.Add + scopes.Push) to measure overhead within this scope's window.
|
||||
internal void NoteSetupOverhead()
|
||||
{
|
||||
ProfilerSetupBytes = Math.Max(0, GC.GetAllocatedBytesForCurrentThread() - allocatedBytesAtStart);
|
||||
}
|
||||
|
||||
internal ScopeNode AddChild(string label, string category, ulong tagMask)
|
||||
{
|
||||
ScopeNode child = RentNode(label, category, tagMask, ManagedThreadId, this);
|
||||
@@ -648,6 +658,7 @@ public static class Profiler
|
||||
|
||||
ScopeNode newScope = scopes.Peek().AddChild(label, category, tagMask);
|
||||
scopes.Push(newScope);
|
||||
newScope.NoteSetupOverhead();
|
||||
}
|
||||
|
||||
[Conditional("PROFILING")]
|
||||
|
||||
Reference in New Issue
Block a user