buildMethodTable function

ProfileMethodTable buildMethodTable({
  1. required CpuSamples cpuSamples,
  2. ProfileFramePredicate? includeFrame,
})

Builds a DevTools-style method table from raw VM CPU samples.

Implementation

ProfileMethodTable buildMethodTable({
  required CpuSamples cpuSamples,
  ProfileFramePredicate? includeFrame,
}) {
  final samplePeriodMicros = cpuSamples.samplePeriod ?? 0;
  final functions = cpuSamples.functions ?? const <ProfileFunction>[];
  final root = _MethodTableOccurrence.root();
  var sampleCount = 0;
  var nextOccurrenceId = 1;

  for (final sample in cpuSamples.samples ?? const <CpuSample>[]) {
    final frames = filterStackFrames(
      sample.stack ?? const <int>[],
      functions,
      includeFrame: includeFrame,
    );
    if (frames.isEmpty) continue;

    sampleCount++;
    var current = root;
    for (final frame in frames.reversed) {
      current = current.childFor(
        frame,
        occurrenceIdFactory: () => nextOccurrenceId++,
      );
      current.totalSamples++;
    }
    current.selfSamples++;
  }

  final methodsById = <String, _MutableMethodEntry>{};
  for (final child in root.children.values) {
    _walkMethodTableOccurrences(
      node: child,
      methodsById: methodsById,
      ancestorOccurrenceIds: const <int>{},
      parentEntry: null,
    );
  }

  final summaries =
      methodsById.values
          .map(
            (entry) => entry.freeze(
              totalSampleCount: sampleCount,
              samplePeriodMicros: samplePeriodMicros,
            ),
          )
          .toList()
        ..sort(_compareMethodSummaries);

  return ProfileMethodTable(
    sampleCount: sampleCount,
    samplePeriodMicros: samplePeriodMicros,
    methods: summaries,
  );
}