TODO: Consider breaking up the PreferenceFragment into smaller, more manageable components. ___ feat: Add simple benchmarking tools refactor: Color preferences are now more user-friendly refactor: Align more with RVX source
561 lines
17 KiB
SQL
561 lines
17 KiB
SQL
WITH
|
|
TargetProcessesByName AS (
|
|
SELECT
|
|
'APP 1' as app_marker,
|
|
'test1.youtube' AS name, -- package name
|
|
1 as app_id
|
|
UNION ALL
|
|
SELECT
|
|
'APP 2' as app_marker,
|
|
'test2.youtube' AS name,
|
|
2 as app_id
|
|
),
|
|
TargetAppUPIDs AS (
|
|
SELECT DISTINCT
|
|
tpbn.app_marker,
|
|
tpbn.app_id,
|
|
p.upid,
|
|
p.pid
|
|
FROM
|
|
process p
|
|
JOIN TargetProcessesByName tpbn ON p.name = tpbn.name
|
|
),
|
|
raw_app_counters AS (
|
|
-- MEMORY COUNTERS
|
|
SELECT
|
|
c.ts,
|
|
target.app_marker AS app_label,
|
|
pct.name AS counter_name,
|
|
CAST(c.value AS REAL) AS value
|
|
FROM
|
|
counter AS c
|
|
JOIN process_counter_track AS pct ON c.track_id = pct.id
|
|
JOIN TargetAppUPIDs target ON pct.upid = target.upid
|
|
UNION ALL
|
|
-- CPU - SLICE DURATIONS
|
|
SELECT
|
|
s.ts,
|
|
target.app_marker,
|
|
'CPU - All Threads Slice Duration (ns)',
|
|
CAST(s.dur AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
UNION ALL
|
|
SELECT
|
|
s.ts,
|
|
target.app_marker,
|
|
'CPU - Main Thread Slice Duration (ns)',
|
|
CAST(s.dur AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.tid = target.pid
|
|
UNION ALL
|
|
-- CPU - PROCESS INSTANCE TOTAL TIME
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Process Instance Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
-- CPU - TOTAL TIME BY THREAD CATEGORY (ms)
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - MainThread Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.tid = target.pid
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - RenderThreads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'RenderThread%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - BinderThreads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'binder:%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - GC (HeapTaskDaemon) Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name = 'HeapTaskDaemon'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - ExoPlayer Threads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'ExoPlayer:%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - JIT Pool Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND (
|
|
t.name LIKE 'Jit thread pool%'
|
|
OR t.name LIKE 'JIT thread pool%'
|
|
)
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - YTCritical Threads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'yt-critica%l Thr%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Runtime Workers Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'Runtime worker%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - HWUI Tasks Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'hwuiTask%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - SharedPreferences Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'SharedPreferenc%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Networking-Ads-SDK Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND (
|
|
t.name LIKE 'Cronet%'
|
|
OR t.name LIKE 'ChromiumNet%'
|
|
OR t.name LIKE 'OkHttp%'
|
|
OR t.name LIKE 'gads-%'
|
|
OR t.name LIKE 'GassClient%'
|
|
OR t.name LIKE 'firebase-%'
|
|
OR t.name LIKE 'Firebase%'
|
|
OR t.name LIKE 'ScionFrontendAp%'
|
|
)
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Glide Threads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND (
|
|
t.name LIKE 'glide-%'
|
|
OR t.name LIKE 'Glide%'
|
|
)
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - GPU Driver (Mali-Gralloc) Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND (
|
|
t.name LIKE 'mali-%'
|
|
OR t.name LIKE 'GrallocUploadTh%'
|
|
)
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Java Finalization-Refs Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND (
|
|
t.name LIKE 'ReferenceQueueD%'
|
|
OR t.name LIKE 'FinalizerDaemon%'
|
|
OR t.name LIKE 'FinalizerWatchd%'
|
|
)
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Primes SDK Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'Primes-%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - V8 DefaultWorkers Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'V8 DefaultWorke%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Generic BG Threads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'BG Thre%ad #%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Generic Blocking Threads Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'Blocking Thread%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - Perfetto Hprof Total Time (ms)',
|
|
CAST(SUM(s.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
sched_slice s
|
|
JOIN thread t ON s.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'perfetto_hprof%'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
-- CPU - SCHEDULING LATENCY (RUNNABLE TIME) BY THREAD CATEGORY (ms)
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - MainThread Sched Latency (ms)',
|
|
CAST(SUM(ts.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
thread_state ts
|
|
JOIN thread t ON ts.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.tid = target.pid
|
|
WHERE
|
|
ts.state = 'R'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
UNION ALL
|
|
SELECT
|
|
0 AS ts,
|
|
target.app_marker,
|
|
'CPU - RenderThreads Sched Latency (ms)',
|
|
CAST(SUM(ts.dur) / 1000000.0 AS REAL)
|
|
FROM
|
|
thread_state ts
|
|
JOIN thread t ON ts.utid = t.utid
|
|
JOIN TargetAppUPIDs target ON t.upid = target.upid
|
|
AND t.name LIKE 'RenderThread%'
|
|
WHERE
|
|
ts.state = 'R'
|
|
GROUP BY
|
|
target.app_marker,
|
|
target.upid
|
|
),
|
|
ranked_counters AS (
|
|
SELECT
|
|
app_label,
|
|
counter_name,
|
|
value,
|
|
ROW_NUMBER() OVER (
|
|
PARTITION BY
|
|
app_label,
|
|
counter_name
|
|
ORDER BY
|
|
value ASC
|
|
) as rn_asc,
|
|
COUNT(*) OVER (
|
|
PARTITION BY
|
|
app_label,
|
|
counter_name
|
|
) as total_count
|
|
FROM
|
|
raw_app_counters
|
|
),
|
|
median_values AS (
|
|
SELECT
|
|
app_label,
|
|
counter_name,
|
|
AVG(value) AS median_value
|
|
FROM
|
|
ranked_counters
|
|
WHERE
|
|
rn_asc IN ((total_count + 1) / 2, (total_count + 2) / 2)
|
|
GROUP BY
|
|
app_label,
|
|
counter_name
|
|
),
|
|
value_frequencies AS (
|
|
SELECT
|
|
app_label,
|
|
counter_name,
|
|
value,
|
|
COUNT(*) as value_occurrence_count
|
|
FROM
|
|
raw_app_counters
|
|
GROUP BY
|
|
app_label,
|
|
counter_name,
|
|
value
|
|
),
|
|
ranked_frequencies AS (
|
|
SELECT
|
|
app_label,
|
|
counter_name,
|
|
value,
|
|
value_occurrence_count,
|
|
ROW_NUMBER() OVER (
|
|
PARTITION BY
|
|
app_label,
|
|
counter_name
|
|
ORDER BY
|
|
value_occurrence_count DESC,
|
|
value ASC
|
|
) as rn_freq
|
|
FROM
|
|
value_frequencies
|
|
),
|
|
mode_values AS (
|
|
SELECT
|
|
app_label,
|
|
counter_name,
|
|
value AS mode_value
|
|
FROM
|
|
ranked_frequencies
|
|
WHERE
|
|
rn_freq = 1
|
|
),
|
|
aggregated_stats_no_median_mode AS (
|
|
SELECT
|
|
app_label,
|
|
counter_name,
|
|
MIN(value) AS min_value,
|
|
AVG(value) AS avg_value,
|
|
MAX(value) AS max_value,
|
|
COUNT(value) AS count_values
|
|
FROM
|
|
raw_app_counters
|
|
GROUP BY
|
|
app_label,
|
|
counter_name
|
|
),
|
|
combined_stats AS (
|
|
SELECT
|
|
s.app_label,
|
|
s.counter_name,
|
|
s.min_value,
|
|
s.avg_value,
|
|
m.median_value,
|
|
mo.mode_value,
|
|
s.max_value,
|
|
s.count_values
|
|
FROM
|
|
aggregated_stats_no_median_mode s
|
|
LEFT JOIN median_values m ON s.app_label = m.app_label
|
|
AND s.counter_name = m.counter_name
|
|
LEFT JOIN mode_values mo ON s.app_label = mo.app_label
|
|
AND s.counter_name = mo.counter_name
|
|
),
|
|
app1_metrics AS (
|
|
SELECT
|
|
*
|
|
FROM
|
|
combined_stats
|
|
WHERE
|
|
app_label = 'APP 1'
|
|
),
|
|
app2_metrics AS (
|
|
SELECT
|
|
*
|
|
FROM
|
|
combined_stats
|
|
WHERE
|
|
app_label = 'APP 2'
|
|
)
|
|
-- Final pivoted table for comparison
|
|
SELECT
|
|
COALESCE(a1.counter_name, a2.counter_name) AS counter_name,
|
|
a1.min_value AS min_app1,
|
|
a2.min_value AS min_app2,
|
|
a1.avg_value AS avg_app1,
|
|
a2.avg_value AS avg_app2,
|
|
a1.median_value AS median_app1,
|
|
a2.median_value AS median_app2,
|
|
a1.mode_value AS mode_app1,
|
|
a2.mode_value AS mode_app2,
|
|
a1.max_value AS max_app1,
|
|
a2.max_value AS max_app2,
|
|
a1.count_values AS count_app1,
|
|
a2.count_values AS count_app2,
|
|
CASE
|
|
WHEN a1.avg_value IS NULL
|
|
AND a2.avg_value IS NOT NULL THEN 'APP 2 Only'
|
|
WHEN a2.avg_value IS NULL
|
|
AND a1.avg_value IS NOT NULL THEN 'APP 1 Only'
|
|
WHEN COALESCE(a1.counter_name, a2.counter_name) LIKE 'CPU - %Slice Duration (ns)' THEN CASE
|
|
WHEN a1.avg_value < a2.avg_value THEN 'APP 1 Lower Avg Slice Duration'
|
|
WHEN a1.avg_value > a2.avg_value THEN 'APP 2 Lower Avg Slice Duration'
|
|
ELSE 'Similar Avg Slice Duration'
|
|
END
|
|
WHEN COALESCE(a1.counter_name, a2.counter_name) LIKE 'CPU - %Total Time (ms)'
|
|
OR COALESCE(a1.counter_name, a2.counter_name) LIKE 'CPU - %Sched Latency (ms)'
|
|
OR COALESCE(a1.counter_name, a2.counter_name) LIKE 'mem.%'
|
|
OR COALESCE(a1.counter_name, a2.counter_name) = 'GPU Memory' THEN CASE
|
|
WHEN a1.avg_value < a2.avg_value THEN 'APP 1 Better (Lower Avg)'
|
|
WHEN a1.avg_value > a2.avg_value THEN 'APP 2 Better (Lower Avg)'
|
|
ELSE 'Similar (Avg)'
|
|
END
|
|
WHEN a1.avg_value < a2.avg_value THEN 'APP 1 Better (Lower Avg)'
|
|
WHEN a1.avg_value > a2.avg_value THEN 'APP 2 Better (Lower Avg)'
|
|
WHEN a1.avg_value = a2.avg_value THEN 'Similar (Avg)'
|
|
ELSE 'N/A or No Data'
|
|
END AS comparison_avg
|
|
FROM
|
|
app1_metrics a1
|
|
FULL OUTER JOIN app2_metrics a2 ON a1.counter_name = a2.counter_name
|
|
ORDER BY
|
|
CASE
|
|
WHEN COALESCE(a1.counter_name, a2.counter_name) LIKE 'CPU - %' THEN 1
|
|
WHEN COALESCE(a1.counter_name, a2.counter_name) LIKE 'GPU %' THEN 2
|
|
WHEN COALESCE(a1.counter_name, a2.counter_name) LIKE 'mem.%' THEN 3
|
|
ELSE 4
|
|
END,
|
|
counter_name;
|