From 361775119b3d338274650f4b766690a04be62d55 Mon Sep 17 00:00:00 2001 From: Steve Golton Date: Mon, 15 Sep 2025 15:53:23 +0100 Subject: [PATCH 1/2] ui: Add self-time to slice aggregation Change-Id: Ie3500362519291ce741fd83f5905840775458631 --- .../slice_selection_aggregator.ts | 35 +++++++++++++++++-- .../trace_processor_slice_track.ts | 7 ++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts index 1712da6e3cd..e963aea059a 100644 --- a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts @@ -21,7 +21,13 @@ import { } from '../../components/aggregation_adapter'; import {AreaSelection} from '../../public/selection'; import {Engine} from '../../trace_processor/engine'; -import {LONG, NUM, STR_NULL} from '../../trace_processor/query_result'; +import { + LONG, + NUM, + NUM_NULL, + STR_NULL, +} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; export class SliceSelectionAggregator implements Aggregator { readonly id = 'slice_aggregation'; @@ -32,6 +38,7 @@ export class SliceSelectionAggregator implements Aggregator { name: STR_NULL, ts: LONG, dur: LONG, + parent_id: NUM_NULL, }); if (!dataset) return undefined; @@ -44,14 +51,32 @@ export class SliceSelectionAggregator implements Aggregator { area.start, area.end, ); + + // Build a table containing the sums of all child slices for each parent + // slice. We can subtract this later from the parent's wall duration to + // calculate the parent's self time. + await using childSliceSelfTime = await createPerfettoTable({ + engine, + as: ` + SELECT + parent_id AS id, + SUM(dur) AS child_dur + FROM (${iiTable.name}) + WHERE parent_id IS NOT NULL + GROUP BY parent_id + `, + }); + await engine.query(` create or replace perfetto table ${this.id} as select name, sum(dur) AS total_dur, sum(dur)/count() as avg_dur, - count() as occurrences + count() as occurrences, + SUM(dur - COALESCE(child_dur, 0)) AS total_self_dur from (${iiTable.name}) + LEFT JOIN ${childSliceSelfTime.name} USING(id) group by name `); @@ -82,6 +107,12 @@ export class SliceSelectionAggregator implements Aggregator { columnId: 'total_dur', sum: true, }, + { + title: 'Self duration', + formatHint: 'DURATION_NS', + columnId: 'total_self_dur', + sum: true, + }, { title: 'Avg Wall duration', formatHint: 'DURATION_NS', diff --git a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/trace_processor_slice_track.ts b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/trace_processor_slice_track.ts index cf2de46771d..9cf086f7f21 100644 --- a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/trace_processor_slice_track.ts +++ b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/trace_processor_slice_track.ts @@ -53,6 +53,7 @@ const schema = { category: STR_NULL, correlation_id: STR_NULL, arg_set_id: NUM_NULL, + parent_id: NUM_NULL, }; export async function createTraceProcessorSliceTrack({ @@ -117,7 +118,8 @@ async function getDataset(engine: Engine, trackIds: ReadonlyArray) { track_id, category, extract_arg(arg_set_id, 'correlation_id') as correlation_id, - arg_set_id + arg_set_id, + parent_id from slice `, filter: { @@ -154,7 +156,8 @@ async function getDataset(engine: Engine, trackIds: ReadonlyArray) { track_id, category, extract_arg(arg_set_id, 'correlation_id') as correlation_id, - arg_set_id + arg_set_id, + parent_id from slice join ${tableName} d using (id) `, From 40bc52c37f7fc068e8c097d97fa821265a177259 Mon Sep 17 00:00:00 2001 From: Steve Golton Date: Mon, 15 Sep 2025 19:30:37 +0000 Subject: [PATCH 2/2] Screenshot tests --- .../frametimeline/frame-timeline-aggregation.png.sha256 | 2 +- .../load_and_tracks.test.ts/mark/mark-0.png.sha256 | 2 +- .../load_and_tracks.test.ts/mark/mark-1.png.sha256 | 2 +- .../load_and_tracks.test.ts/mark/mark-2.png.sha256 | 2 +- .../load_and_tracks.test.ts/mark/mark-3.png.sha256 | 2 +- .../track-expand-and-collapse/traced-probes-expanded.png.sha256 | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/data/ui-screenshots/aggregation.test.ts/frametimeline/frame-timeline-aggregation.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/frametimeline/frame-timeline-aggregation.png.sha256 index 2633a1880dd..7f82f18d97a 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/frametimeline/frame-timeline-aggregation.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/frametimeline/frame-timeline-aggregation.png.sha256 @@ -1 +1 @@ -6a2f973123ca6c07d1bf6f671624c4a37d234a79f147ecd840e2ded88605fc3a \ No newline at end of file +dbcf803a8735144628bf91534a456aebf9cb8910441fbedad1d5d819df8fca1f \ No newline at end of file diff --git a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-0.png.sha256 b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-0.png.sha256 index f0eb8091b0c..fbef195a414 100644 --- a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-0.png.sha256 +++ b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-0.png.sha256 @@ -1 +1 @@ -81369b8cff7e2de1e9498994c000b3fda25449e57ab6c3df8c590d8e29fd81d6 \ No newline at end of file +123f6900123df8e47e09ab60c3489379c8ed05c602946860bc1bb89d39d355a2 \ No newline at end of file diff --git a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-1.png.sha256 b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-1.png.sha256 index f0eb8091b0c..fbef195a414 100644 --- a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-1.png.sha256 +++ b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-1.png.sha256 @@ -1 +1 @@ -81369b8cff7e2de1e9498994c000b3fda25449e57ab6c3df8c590d8e29fd81d6 \ No newline at end of file +123f6900123df8e47e09ab60c3489379c8ed05c602946860bc1bb89d39d355a2 \ No newline at end of file diff --git a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-2.png.sha256 b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-2.png.sha256 index a2901118c74..471f7bf26d8 100644 --- a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-2.png.sha256 +++ b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-2.png.sha256 @@ -1 +1 @@ -9b3970262c1119e2b59dc17e7ab194193da3ef94b721afac1c2a3b3e7df79637 \ No newline at end of file +a06f4c5be0b82d2703f205827a7d51dcc6e92fec37f1dd44d7c0089ff90153e6 \ No newline at end of file diff --git a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-3.png.sha256 b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-3.png.sha256 index 0524f830bd3..a8e95167a8f 100644 --- a/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-3.png.sha256 +++ b/test/data/ui-screenshots/load_and_tracks.test.ts/mark/mark-3.png.sha256 @@ -1 +1 @@ -d5a4f26a2bab178a893253fc0483b5975fbfb7782708396be8788eca3baea19d \ No newline at end of file +23712fac12e1bae76307a9c45c391b86e259aad2830d3c59627659730cd89f41 \ No newline at end of file diff --git a/test/data/ui-screenshots/load_and_tracks.test.ts/track-expand-and-collapse/traced-probes-expanded.png.sha256 b/test/data/ui-screenshots/load_and_tracks.test.ts/track-expand-and-collapse/traced-probes-expanded.png.sha256 index 17f18b6b202..1474bc3bafd 100644 --- a/test/data/ui-screenshots/load_and_tracks.test.ts/track-expand-and-collapse/traced-probes-expanded.png.sha256 +++ b/test/data/ui-screenshots/load_and_tracks.test.ts/track-expand-and-collapse/traced-probes-expanded.png.sha256 @@ -1 +1 @@ -6563a1b26d99bd8b0275e3f2580a9812e0681fddf2a50ed452e08263fdb1c203 \ No newline at end of file +5d397abbd72eed59a2689083d212a6e7b358a2ac0735c4af2f178d807fc216d9 \ No newline at end of file