Android 为什么traceview给出的测量结果不一致?

Android 为什么traceview给出的测量结果不一致?,android,profiling,android-traceview,Android,Profiling,Android Traceview,我正试图加快我的应用程序启动时间(由于Guice绑定速度慢,目前约5秒),当我运行traceview时,我看到执行相同代码的测量值有很大的变化(高达30%) 我假设这是由于垃圾收集的不同,但是根据traceview,花在startGC上的时间是完全不重要的 这尤其令人恼火,因为当度量值如此多变时,很难确定优化的效果 为什么会发生这种情况?有没有办法使测量结果更加一致?我想您是从代码开始分析,而不是手动打开它?但无论如何,即使您从代码的特定点使用Debug.startMethodTracing和D

我正试图加快我的应用程序启动时间(由于Guice绑定速度慢,目前约5秒),当我运行traceview时,我看到执行相同代码的测量值有很大的变化(高达30%)

我假设这是由于垃圾收集的不同,但是根据traceview,花在
startGC
上的时间是完全不重要的

这尤其令人恼火,因为当度量值如此多变时,很难确定优化的效果


为什么会发生这种情况?有没有办法使测量结果更加一致?

我想您是从代码开始分析,而不是手动打开它?但无论如何,即使您从代码的特定点使用
Debug.startMethodTracing
Debug.stopMethodTracing
,您也会收到不同的测量结果

您可以看到Traceview禁用了JIT,我相信还有其他一些优化,因此在评测期间,代码的执行速度比没有JIT时慢。此外,代码性能取决于总体系统负载。如果其他应用程序在后台执行任何繁重的操作,您的代码将执行更长的时间。所以你肯定会得到一个稍微不同的结果,所以启动时间不能是一个常数


通常情况下,与其他方法相比,方法执行的时间并不重要,重要的是它所消耗的CPU时间。

听起来测量并不是你的最终目标。你的最终目标是让它更快

要做到这一点,就要找出哪些活动占用了大部分时间,这样你就可以找到更好的方法。 我说的是“发现”,不是“测量”,我说的是“活动”,不是“常规”

为此,只需对程序的状态进行采样。 许多探查器收集了大量程序状态的样本,但它们都属于相同的逻辑——它们的总结基于这样一种理论,即您只需要测量,而您并不真正关心什么

事实上,如果你能详细检查一些样本而不是总结,它会告诉你更多关于程序是如何花费时间的

更重要的是,如果仅在两(2)个样本上,您就可以看到该计划正在追求某个目标,并且您可以显著提高,您将看到显著的加速。 这个过程可以重复几次,这就是如何真正优化它


我们将更详细地解释此过程,并提供一个用例。

如果您在启动时正在执行任何与网络相关的活动,那么此工具可以帮助您了解正在发生的事情以及如何优化连接和缓存

我说的是测量CPU时间,这当然是traceview提供的唯一指标。我提到五秒钟的启动时间(用秒表测量而不启用配置文件)作为一开始配置文件动机的介绍,一定把你弄糊涂了。那么,我如何以合理的一致性来衡量启动所消耗的CPU时间呢?是的,我使用的是Debug.start/stopMethodTracing,我认为不可能获得比您已有的更多的一致性。如果您的初始化过程使用一些IO函数来读取数据,那么它就不会是一致的。另外,我假设您的代码在单独的线程中运行,因此如果它在单处理器系统上运行,那么分析结果将取决于系统线程调度程序,因为实际上您的代码不会一直连续执行。我很确定,不可能从不同的发射中获得完全相同的跟踪。有趣的是,除非我遗漏了什么,否则这无助于回答这个问题。Traceview已经给出了一个完全确定的方法调用计数和层次结构。@Jeff:1)不要期望时间测量的一致性。有太多不可控制的因素,无论如何都没关系。2) 关于呼叫计数和层次结构,请检查问题。它似乎在告诉你你需要知道的一切,但事实并非如此。