2

我正在分析每 5 秒执行一次的应用程序中的函数。但是,我在跟踪视图的“Calls + Rec/Total”选项中只看到了一半的调用。我正在使用 1 微秒作为采样间隔的基于样本的分析。我尝试使用这种采样率,但没有明显的改进。例如,当我运行视图 236 秒时,我应该在“Call + Rec/Total”选项中获得 47 个调用,但是如下图所示,它只显示 20 个。谁能评论我做错了什么?

Tested devices: 
Device 1: SmartWatch LG R (Android 6.0.1), observes this problem
Device 2: Samsung Galaxy S2 (Android 5.0.1 Custom ROM), observes this problem
Device 3: Samsung Galaxy S2 (Android 4.4, Custom ROM), works fine 

在此处输入图像描述

更新: 根据我与@kws 的讨论,我在第二台三星(最初使用 Android 5.1.1)上安装了 Android 4.4.4,现在基于采样的方法可以正常工作。但是,搭载 Android 6.0.1 的智能手表仍然采用旧的跟踪视图方式。

更新 2: 我认为基于采样的方法没有捕获非常轻量级函数的分辨率,因为这些函数可能是在两个样本之间执行的,而探查器会遗漏它。虽然它以微秒作为采样间隔记录数据,但我怀疑它是否可以达到如此详细的粒度。这个论点背后的原因是,当我用它测试一个非常轻量级的函数时,并不是每个调用都在所有三个设备上都被捕获。

4

1 回答 1

1

我做了一些测试,发现这里有同样的行为(在 Kitkat 和 Marshmallow 上运行)。似乎如果您使用基于样本的分析并将采样率设置得太低,您会得到不准确的结果。如果提高采样率,可能会得到更准确的结果。另一方面,如果您使用基于跟踪的分析,则结果是准确的。

我认为这些基于样本的分析结果是可以接受的,因为分析器应该返回样本结果而不是实际结果。至于 1 μs 采样间隔的情况,我认为它的成功执行也取决于设备。也许高端设备可以产生更好的结果。

另外需要注意的一点是,根据docs,分析不应用于生成绝对时间,而应用于检查代码优化的结果。

启用分析后,解释的代码运行得更慢。不要试图从分析器结果中生成绝对时间(例如,“函数 X 需要 2.5 秒才能运行”)。这些时间仅对其他配置文件输出有用,因此您可以查看更改是否使代码相对于之前的配置文件运行更快或更慢。

编辑

如果您想要更精确的结果,那么您必须进行基于跟踪的分析,或者您必须使用更准确的 Debug 类。使用后者,您将能够准确指定在代码中开始和停止记录跟踪数据的位置。更多信息在这里

于 2016-10-29T13:30:00.520 回答