Android Traceview(基于采样的跟踪)不反映函数调用的实际数量

时间:2016-10-27 18:16:11

标签: android android-studio android-sdk-tools ddms android-traceview

我在应用程序中分析一个每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 

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  

启用性能分析时,解释的代码运行得更慢。别试试   从分析器结果生成绝对时间(例如,   “功能X需要2.5秒才能运行”)。时间只适用于   与其他配置文件输出的关系,以便您可以查看是否进行了更改   相对于先前的分析运行,代码更快或更慢。

修改

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