1

昨天,我花了 12 个小时成为 Traceview 的学生。在此之前,我什至不知道它存在(羞愧地垂头丧气)。

现在我已经克服了它产生的数据的绝对冲击,我发现 Traceview 可以归结为几个简单的概念:

  1. 按“EXCL CPU TIME”排序,以确定每个单独方法单独使用的使用量。
  2. 查看调用频率和每次调用的 CPU 时间/实时时间。显然应该研究更高的调用。根据我的大部分经验,如果您按上面的 #1 排序,调用过多且花费过多时间的方法也将位于列表的顶部(因为它们也使用最多的 CPU 是有道理的)。

无论如何,执行上面的这两个步骤,我发现 3-4 种方法总是使用我 90% 的 CPU 并占用我应用程序中的大部分实时延迟。唯一的问题是,这些方法都不是我写的方法,它们是系统方法,例如:

  1. BitmapFactory 方法
  2. WebKit 方法
  3. 和其他系统方法

话虽如此,假设如果顶级资源消耗是系统方法,那么它一定与我的布局设计有关吗?我不知道 BitmapFactory 怎么可能这么高,我的布局并不是非常复杂,尽管在一个 Activity 中 BitmapFactory 本身占用了 95% 的资源。

TL;DR - 如果我运行 Traceview,并且如果我发现最重要的资源都是系统方法,这是否意味着这是一个布局问题?或者,我怎么能说出为什么系统方法如此之高,因为它与我的自定义方法没有直接关系。

非常感谢,瑞安

4

2 回答 2

3

我发现 Traceview 可以归结为几个简单的概念:

恕我直言,这些概念不是最好的。

按“EXCL CPU TIME”排序以确定每个单独方法单独使用的使用量

特别是,恕我直言,这个概念相当糟糕。是的,这是有用的数据。但是,您随后需要备份调用堆栈以尝试找出触发此事件的原因。有时,它将直接是您的代码。有时,它会是您认为是框架一部分的其他东西(例如,onDraw()a 的一部分View)。仅仅知道某个随机方法会占用大量时间,除非您首先确定是什么触发了该方法被调用,否则您并没有什么好处。

如果我运行 Traceview,并且如果我发现最重要的资源都是系统方法,这是否意味着这是一个布局问题?

不。

或者,我怎么能说出为什么系统方法如此之高,因为它与我的自定义方法没有直接关系。

沿着调用堆栈往上走,找出是谁如此频繁地或在不合时宜的时候调用这些方法。

例如,在BitmapFactory示例中,您可能会发现您(或您正在使用的库)正在调用BitmapFactory,并且可能正在主应用程序线程上这样做。

要在调用堆栈中向上工作,请单击代表某些感兴趣方法的行左边缘的三角形。然后,您将在其下方看到两个分支:“父母”和“孩子”。“父母”代表方法调用堆栈的下一级,您可以继续沿着父母链向上工作,直到找到您认识的东西。

这就是为什么,恕我直言,您最好按包含时间排序,因为您的代码(直接是罪魁祸首)往往会冒泡到顶部。

于 2013-06-09T17:34:41.337 回答
0

好吧,我发现了问题,而且很苦。这很好,因为不是我的代码或布局导致了问题,而是使用 loadAdOnCreate="true" 来创建广告的 admob AdView。这很痛苦,因为如果我不能消除 AdView 造成的加载延迟,我现在可能不得不转换收入来源!这是一个很难找到的,但我应该预料到这一点!

于 2013-06-12T02:53:00.017 回答