Android Traceview(基于采样的跟踪)不反映函数调用的实际数量
Android Traceview (Sampling based trace) doesn't reflect the actual number of function calls
我正在分析应用程序中每 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 的智能手表仍然以跟踪视图的旧方式运行。
更新二:
我认为基于采样的方法没有捕获非常轻量级函数的分辨率,因为这些函数可能是在两个样本之间执行的,并且它会被这个探查器遗漏。虽然它以微秒为采样间隔记录数据,但我怀疑它能否达到如此详细的粒度。这个论点背后的原因是,当我用它测试一个非常轻量级的函数时,并不是每个调用都在所有三个设备上被捕获。
我做了一些测试,发现这里有相同的行为(运行 在 Kitkat 和 Marshmallow 上)。似乎如果您使用基于样本的分析并将采样率设置得太低,您会得到不准确的结果。如果增加采样率,可能会得到更准确的结果。
另一方面,如果您使用基于跟踪的分析,结果是准确的。
我认为那些基于样本的分析结果是可以接受的,因为分析器应该 return 样本结果而不是实际结果。至于 1 μs 采样间隔的情况,我认为它的成功执行也取决于设备。也许高端设备可以产生更好的效果。
另外需要注意的重要一点是,根据 docs,分析不应该用于生成绝对时间,而是用于检查代码优化的结果。
Interpreted code runs more slowly when profiling is enabled. Don't try
to generate absolute timings from the profiler results (such as,
"function X takes 2.5 seconds to run"). The times are only useful in
relation to other profile output, so you can see if changes have made
the code faster or slower relative to a previous profiling run.
编辑
如果您想要更精确的结果,则必须进行基于跟踪的分析,或者必须使用更准确的调试 class。使用后者,您将能够准确指定在代码中开始和停止记录跟踪数据的位置。更多信息 here.
我正在分析应用程序中每 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 的智能手表仍然以跟踪视图的旧方式运行。
更新二: 我认为基于采样的方法没有捕获非常轻量级函数的分辨率,因为这些函数可能是在两个样本之间执行的,并且它会被这个探查器遗漏。虽然它以微秒为采样间隔记录数据,但我怀疑它能否达到如此详细的粒度。这个论点背后的原因是,当我用它测试一个非常轻量级的函数时,并不是每个调用都在所有三个设备上被捕获。
我做了一些测试,发现这里有相同的行为(运行 在 Kitkat 和 Marshmallow 上)。似乎如果您使用基于样本的分析并将采样率设置得太低,您会得到不准确的结果。如果增加采样率,可能会得到更准确的结果。 另一方面,如果您使用基于跟踪的分析,结果是准确的。
我认为那些基于样本的分析结果是可以接受的,因为分析器应该 return 样本结果而不是实际结果。至于 1 μs 采样间隔的情况,我认为它的成功执行也取决于设备。也许高端设备可以产生更好的效果。
另外需要注意的重要一点是,根据 docs,分析不应该用于生成绝对时间,而是用于检查代码优化的结果。
Interpreted code runs more slowly when profiling is enabled. Don't try to generate absolute timings from the profiler results (such as, "function X takes 2.5 seconds to run"). The times are only useful in relation to other profile output, so you can see if changes have made the code faster or slower relative to a previous profiling run.
编辑
如果您想要更精确的结果,则必须进行基于跟踪的分析,或者必须使用更准确的调试 class。使用后者,您将能够准确指定在代码中开始和停止记录跟踪数据的位置。更多信息 here.