性能优化第一步:Profiler的使用

3,137 阅读4分钟

前言

最近申请了一个比较低端的测试机,然后惊讶的发现...我们的app竟然这么的卡...虽然说app卡很烦,但是我又不用,关我啥事~ 不过作为一个德智体美劳全面发展的新时代程序员,还是应该“象征性”的查一下问题。卡顿的出现无非是在主线程里边做了耗时操作,影响了主线程对UI的绘制,造成了卡顿的现象。 因此我们只需要找到主线程中耗时的函数,然后对其进行异步处理即可解决问题。 所以今天咱们聊一聊AndroidStudio中检查函数耗时的工具:CPU Profiler

当然大家也可以直接参考官方文档:developer.android.google.cn/studio/prof…

CPU Profiler

首先来说,CPU Profiler并不是专门用于处理页面卡顿掉帧的,准确说:CPU Profiler是用来查看每个线程,在某段一段时间内执行了哪些函数,以及在其执行期间每个函数消耗的 CPU 资源。 专门针对卡顿掉帧问题可以使用内置的小工具:systrace

不整官网那么多“花里胡哨”的介绍,咱们直击上应用方式。

1、使用界面

点击启动后,我们就可以看到如下的内容:

不得不吐槽,Profiler用起来是真的卡

红框圈住的内容,从上到下依次是:

  • 当前运行的Activity
  • CPU使用情况
  • 内存使用情况
  • 网络使用情况

我们点击一下CPU,就可以进一步的查看CPU的使用情况。

2、详细分析

这个图,表示了当前CPU的使用率,当然这个使用率对应了整个手机,并不能准确的反应我们自己app的真实情况。接下来咱们针对代码,来看一下具体的使用:

我在代码里做了什么呢?很简单,一个postdelay,然后里边做一个入参为40的递归菲波那切数列。

Handler().postDelayed({
    fibonacci(40)
}, 20000)

接下让咱们看一下这个函数的耗时。

我们需要在我们认为合适的时机,点一下Record

因为我这里是delay了20秒,所以我在17、8秒的时候Record

然后在一个合适的时机,再点一下Stop

然后我们就会看到这样的结果:

这样我们就可以很清晰的看到这段时间内产生的函数调用关系。鼠标移到对应的函数,还可以看到对应的耗时。

因此我们可以将这段耗时函数移到异步去做,比如这样:

不要在意这疯狂的Thread使用方式,就是表达一下异步的这么个意思。哈哈~

Handler().postDelayed({
    Thread {
        fibonacci(40)
    }.start()
}, 20000)

那么接下来,咱们在Record一下:

此时我们会发现,虽然我们的CPU使用率在上升,但是对于我们主线程来说并没有任何耗时操作(也就是第二个红框)。

如果我们下滑一下选项框,我们会发现,我们的耗时操作在这:

当我们点击它时,我们就可以看到这个线程的函数调用:

3、显示模式

细心的小伙伴可能注意到了:分析函数调用的时候有四个选项卡可供选择。

那它们都分别什么意思呢?这里简单的介绍一下:

Call Chart:

x轴表示函数调用(或调用方)的时间段和时间,并沿y轴显示其被调用者。 对系统 API 的函数调用显示为橙色,对应用自有函数的调用显示为绿色,对第三方 API(包括 Java 语言 API)的函数调用显示为蓝色

示意图类似于这样:

Flame Chart

俗称的火焰图。对于火焰图来说,它就是汇总了Call Chart,并按照调用顺序倒序排列,就像这样:

Top Down、Bottom Up

这俩种模式相对比较复杂,大家可以参考官方文档的解释配合使用。

尾声

这篇文章就是我想聊的内容,就是很简单很简单的工具应用。但是它代表了你踏出性能优化的第一步,踏出第一步将意味着,后面将有一个又一个坑等着你。

来吧,既然选择了远方,便只顾风雨兼程!

我是一个应届生,最近和朋友们维护了一个公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油~

个人公众号:咸鱼正翻身