Android性能优化--Perfetto用SQL性能分析

Android性能优化--Perfetto用SQL性能分析

文章目录

本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134167741

最新更新地址 https://gitee.com/chenjim/chenjimblog

Perfetto 抓取 trace 可参考 https://blog.csdn.net/CSqingchen/article/details/128900541

介绍

Perfetto 是一个由 Google 开发的高性能、可扩展的事件追踪系统,用于在实时和离线场景下监控系统的性能。

它通过一种简单且强大的查询语言(称为 SQL)来分析和查询事件数据。

在本博客中,我们将深入探讨如何使用 SQL 在 Perfetto 中进行性能分析。

Perfetto SQL 基础

Perfetto SQL 是一种用于查询事件数据的语言,它支持大多数标准的 SQL 操作,

如 SELECT、FROM、WHERE、GROUP BY、ORDER BY 等。

在 Perfetto 中,数据以表格的形式存储,因此你可以使用 SQL 来检索和操作这些数据。

下面是一个简单的 Perfetto SQL 查询示例:
SELECT ts, dur, name FROM slice WHERE ts > 85545835986081 AND ts < 85546017415330
ts, dur, name 是挑选的字段,slice 是挑选的表名

示例 trace 文件可以在 data/perfetto下载 xiaomi13.camera.trace.7z

解压后,在 https://ui.perfetto.dev/ 打开

可以使用如下命令查看表中有哪些字段
SELECT * FROM slice LIMIT 10

如果 trace 中包含 android log,还可以用如下命令过滤日志
SELECT * FROM android_logs WHERE msg LIKE "%ProcessRequest%" LIMIT 30

trace 中有哪些表可用,以及各个字段是什么关系呢,可以参考
https://perfetto.dev/docs/analysis/sql-tables

其中 Event 关系图如下

使用 Perfetto SQL 进行性能分析

使用 Perfetto SQL 进行性能分析的关键在于理解如何构造查询以获取你需要的信息。

以下是一些常见的性能分析任务和相应的 SQL 查询示例:

  1. 分析特定事件的发生频率:
    SELECT COUNT(*) FROM slice WHERE name = 'waitForNextFrame'
    waitForNextFrame 一共有多少次

  2. 分析事件的性能数据:
    SELECT (dur/1e6) FROM slice WHERE name = 'waitForNextFrame'
    每次 waitForNextFrame 耗时多少毫秒。dur单位是纳秒

  3. 分析一段时间内的事件数据:
    SELECT MIN(dur/1e6) as min_duration, MAX(dur/1e6) as max_duration, AVG(dur/1e6) as avg_duration FROM slice WHERE name = 'waitForNextFrame' and dur > 0
    显示 waitForNextFrame 最小、最大、平均值

  4. 对事件进行排序:
    SELECT (dur/1e6),ts,name FROM slice WHERE name LIKE '%wait%' and dur > 0 ORDER by dur DESC

  5. 统计 CPU 时间

    sql 复制代码
     DROP VIEW IF EXISTS slice_with_utid;
     CREATE VIEW slice_with_utid AS
     SELECT
     ts,
     dur,
     slice.name as slice_name,
     slice.id as slice_id, utid,
     thread.name as thread_name
     FROM slice
     JOIN thread_track ON thread_track.id = slice.track_id
     JOIN thread USING (utid);
    
     DROP TABLE IF EXISTS slice_thread_state_breakdown;
     CREATE VIRTUAL TABLE slice_thread_state_breakdown
     USING SPAN_LEFT_JOIN(
     slice_with_utid PARTITIONED utid,
     thread_state PARTITIONED utid
     );
    
     SELECT slice_id, slice_name, SUM(dur) AS cpu_time
     FROM slice_thread_state_breakdown
     WHERE state = 'Running'
     GROUP BY slice_id;

基本都是 SQL 语句,SQL关键字含义可以参考 https://www.w3schools.cn/sql/

总结

使用 Perfetto 和 SQL 进行性能分析是一种强大而灵活的方法。

通过理解如何构造 SQL 查询,你可以轻松地获取你需要的信息,从而更好地理解系统的性能。

在 Perfetto 中使用 SQL 进行性能分析可以帮助你更好地理解系统的性能,并找出潜在的性能问题。

相关文章
Android性能优化--Perfetto抓取trace
Android性能优化--perfetto分析native内存泄露
Android性能优化--Perfetto用SQL性能分析

参考文章
https://perfetto.dev/docs/quickstart/trace-analysis
https://perfetto.dev/docs/analysis/common-queries
https://zhuanlan.zhihu.com/p/641412977
https://yiyan.baidu.com/share/gdFw3P5ucI

相关推荐
川石课堂软件测试8 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
tongyiixiaohuang8 小时前
WMS已发货状态反写金蝶云星空:单策略实战教程
android
2501_937767168 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
好的佩奇9 小时前
Dart 之类修饰符
android·flutter·dart
alexhilton10 小时前
用Konsist与Lint强制执行设计系统契约
android·kotlin·android jetpack
北京自在科技14 小时前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB137516 小时前
Jetpack Compose 动画Modifier.animateItem()
android
l1t17 小时前
DeepSeek总结的ALTER FUNCTION SET work_mem:无需全局更改即可修复 PostgreSQL 磁盘溢出
sql·缓存·postgresql
2401_8858850417 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往18 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava