您已经收到来自移动应用程序用户的性能不佳的报告,并且无法在开发环境中重现该问题。在无法物理访问的设备上,从哪里开始调试问题?您的应用程序与许多其他应用程序一样,具有数百个视图和用户流,其中任何一个都可能引起该问题。由于仅在特定条件下(特定的应用程序版本,操作系统版本或设备型号)可能仅在特定条件下重现该问题,这使问题更加复杂化,仅在大型矩阵中列出了一些变量。
我们从建立对跟踪的支持开始-通过自动收集有关CPU,内存,网络请求等的性能统计信息来检测代码部分。我们从这些跟踪中汇总了数据,以鸟瞰您的应用程序的性能以及应用程序版本之间的性能变化。但是,仅凭跟踪就无法诊断生产中出现的特定性能问题,这就是为什么我们在我们的平台上将跨度作为新的检测原语添加的原因,它将有助于针对这些用例。
这篇文章中的案例研究提出了Specto要解决的一种问题。如果您觉得这些情况听起来太熟悉了,并且您有兴趣尝试使用全套工具来改善iOS或Android应用程序的性能,请通过https://specto.dev请求访问Specto。
跨度有助于分解较大的任务,例如将内容的滚动提要呈现为较小的子组件,可以对这些子组件进行单独分析以找出性能问题的根本原因。通过在代码段中添加开始和结束标记来创建跨度,然后在我们的仪表板上对其进行测量和可视化。
与跟踪不同,跨度可以并发和嵌套,并且同一跟踪中可以存在多个具有相同名称的跨度。我们建议您使用跨度来标记应用程序中跟踪交互中更细粒度的高级操作,例如,从网络中获取数据,从缓存中读取数据或执行资源密集型任务,例如图像处理。
一目了然,散点图可用于识别持续时间短或长的迹线簇。通过使用过滤器栏,可以使用诸如其时间戳记,持续时间,设备型号等属性来过滤跟踪列表。这些工具将帮助您缩小发现性能问题的踪迹范围。
让我们看一下使用跨度数据可以帮助我们可视化性能问题并了解如何解决它的实际情况。我们有一个iOS应用程序,可用于在内部测试Specto SDK-此应用程序将渲染即将上映的电影的提要,用户可以打开电影来查看作品,说明,演员表和其他信息。在加载电影的详细信息屏幕时,我们捕获了以下跟踪:
绿色的跨度表示选择加入网络检测并使用标签将请求列入白名单后,Specto SDK会自动捕获检测到的网络呼叫。蓝色的跨度是已经使用开始和结束标记明确添加到代码中的跨度,这很容易:
从时间轴上,我们可以看到并行进行了一些操作,以获取电影信息,例如艺术品,视频和片数。看起来大多数操作在此跟踪中大约在130 ms标记处结束,但是有一些操作(如加载电影视频和加载电影信用)稍后开始,导致跟踪总共花费319 ms。
通过查看应用程序的源代码,我可以看到在电影细节请求返回响应之后,我们开始了对电影视频和电影信用的获取,这意味着该数据的渲染也将在以后开始。这是没有必要的,因为对视频和字幕的获取不依赖于电影细节响应中返回的数据,而电影细节只是获取诸如标题和描述之类的基本电影元数据。我们可以提出两种优化路径:
首先,立即开始对视频和字幕的提取,同时我们启动电影详细信息请求。
我们用于获取电影信息的API支持批量获取,因此我们可以批量获取同一电影详细信息请求中的视频和信用信息,而避免一并提出多个请求。
我们选择实施#2,因为我们的电影服务API客户端已经支持批量提取。代码差异如下所示:
进行此更改后,我们发布了该应用程序的新版本并收集了更多跟踪。这是来自新版本的同一屏幕的跟踪:
我选择了一条来自同一设备型号的跟踪,并且对网络请求的持续时间大致相同,因为请求等待时间的差异可能会使跟踪的总体持续时间发生偏差。
我们立即注意到,视频和字幕的单独提取已消失,因为它们已被批处理到单个电影详细信息请求中。结果,此跟踪的持续时间为143毫秒,比原始时间减少了55%!
除了提供跨度之类的更高级别的构造之外,我们还运行一个采样探查器以收集功能级别的性能数据。与要求您物理连接开发设备并在计算机上捕获配置文件的Instruments和Android Profiler之类的工具不同,Specto的所有配置文件数据都是在实际用户设备上的生产环境中收集的-您可以专注于交付应用程序而不必担心关于尝试模拟现实世界中可能出现的多种性能场景。
在任何跟踪中,都可以打开跟踪详细信息页面右上角的“调用树”菜单,以查看在跟踪执行期间收集的样本的树表示。例如,我们可以在上一个示例中描述的同一应用程序的启动路径中捕获的跟踪中看到此调用树:
它在广泛使用的第三方SDK的初始化期间运行,该SDK执行执行一些昂贵的代码(约170ms),并将这些代码写入后台队列中的SQLite数据库。这不是立即引起关注的原因,因为该代码未在主线程上运行,但是如果确实如此,我们希望将该代码移出启动路径,以使应用程序具有更高的响应速度。
要查看更多详细信息,请单击“查看跟踪”按钮以打开一个火焰图,该图是使用跟踪期间收集的所有样本(以线程分隔)构建的。在另一条迹线中,我们可以看到对电影海报图像的图像处理操作需要花费多长时间:
感谢您的阅读!我们一直在尝试通过添加新功能来改进Specto平台,以使其更容易检测和解决应用程序中的性能问题。如果您想了解最新信息,请在Twitter上关注我们,并请求访问我们的网站进行尝试。