buildMethodTable function
ProfileMethodTable
buildMethodTable({
- required CpuSamples cpuSamples,
- 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,
);
}