@@ -50,6 +50,7 @@ public sealed class PerfettoGenericEventCooker : CookedDataReflector, IComposite
5050 public static readonly DataCookerPath DataCookerPath = PerfettoPluginConstants . GenericEventCookerPath ;
5151
5252 public string Description => "Generic Event composite cooker" ;
53+ const string Root = "[Root]" ;
5354
5455 public DataCookerPath Path => DataCookerPath ;
5556
@@ -90,6 +91,9 @@ public sealed class PerfettoGenericEventCooker : CookedDataReflector, IComposite
9091 // The name of the optional ProviderGuid mapping file
9192 private const string ProviderMappingXmlFilename = "ProviderMapping.xml" ;
9293
94+ // In order to consolidate like paths for common events and thus reduce memory / processing
95+ private Dictionary < int , string [ ] > ParentEventNameTreeBranchDictKeyNotReversed = new Dictionary < int , string [ ] > ( ) ;
96+
9397 public PerfettoGenericEventCooker ( ) : base ( PerfettoPluginConstants . GenericEventCookerPath )
9498 {
9599 this . GenericEvents =
@@ -236,15 +240,37 @@ join processTrack in processTrackData on slice.TrackId equals processTrack.Id in
236240
237241 int parentTreeDepthLevel = 0 ;
238242 long ? currentParentId = result . slice . ParentId ;
239-
243+ List < string > tmpParentEventNameTreeBranch = new List < string > ( ) ;
244+ tmpParentEventNameTreeBranch . Add ( result . slice . Name ) ;
245+
240246 // Walk the parent tree
241247 while ( currentParentId . HasValue )
242248 {
243249 var parentPerfettoSliceEvent = sliceData [ ( int ) currentParentId . Value ] ;
244250 // Debug.Assert(parentPerfettoSliceEvent == null || (parentPerfettoSliceEvent.Id == currentParentId.Value)); // Should be guaranteed by slice Id ordering. Since we are relying on index being the Id
245- currentParentId = parentPerfettoSliceEvent != null ? parentPerfettoSliceEvent . ParentId : null ;
251+
252+ if ( parentPerfettoSliceEvent != null )
253+ {
254+ currentParentId = parentPerfettoSliceEvent . ParentId ;
255+ tmpParentEventNameTreeBranch . Add ( parentPerfettoSliceEvent . Name ) ;
256+ }
257+ else
258+ {
259+ currentParentId = null ;
260+ }
261+
246262 parentTreeDepthLevel ++ ;
247263 }
264+ tmpParentEventNameTreeBranch . Add ( Root ) ;
265+
266+ string [ ] finalParentEventNameTreeBranch ;
267+ var tmpParentEventNameTreeBranchHashCodeNotReversed = tmpParentEventNameTreeBranch . GetHashCode ( ) ;
268+ if ( ! ParentEventNameTreeBranchDictKeyNotReversed . TryGetValue ( tmpParentEventNameTreeBranchHashCodeNotReversed , out finalParentEventNameTreeBranch ) )
269+ {
270+ tmpParentEventNameTreeBranch . Reverse ( ) ;
271+ finalParentEventNameTreeBranch = tmpParentEventNameTreeBranch . ToArray ( ) ;
272+ ParentEventNameTreeBranchDictKeyNotReversed . Add ( tmpParentEventNameTreeBranchHashCodeNotReversed , finalParentEventNameTreeBranch ) ;
273+ }
248274
249275 PerfettoGenericEvent ev = new PerfettoGenericEvent
250276 (
@@ -264,7 +290,8 @@ join processTrack in processTrackData on slice.TrackId equals processTrack.Id in
264290 provider ,
265291 result . threadTrack ,
266292 result . slice . ParentId ,
267- parentTreeDepthLevel
293+ parentTreeDepthLevel ,
294+ finalParentEventNameTreeBranch
268295 ) ;
269296 this . GenericEvents . AddEvent ( ev ) ;
270297 }
0 commit comments