背景
前些日子排查到项目中tab快速切换产生卡顿。文章地址:https://www.sunofbeach.net/a/1458628420228374530
当时是对比代码发现的,是在切换的时候增加循环打印了list
,输出大量log
。 由于项目比较复杂的,当时还没有时间详细分析具体的耗时。 今天就开一个demo来单独分析打印log,到底执行了些什么,为什么会卡顿
。
环境
项目中切换tab附带很多业务,以后有时间再排查。 现在的环境我们精简下。 A页面一个按钮,点击跳转到B页面。在点击事件中,增加log。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_demo).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testLog();
}
});
}
private String base64 = "data:image/png;base64,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";
private void testLog() {
Log.i("gggg", "start");
for (int i = 0; i < 300; i++) {
Log.i("tagg", base64 + base64 + base64 + base64);
}
Intent intent = new Intent(this, DemoActivity.class);
startActivity(intent);
}
log的内容,我拿了一个之前的base64来模拟项目中的超长的json数据,循环次数也是模拟。项目中数据没有那么多。我们就把次数增大,让卡顿来得更猛烈些,好让我们察觉!
Profiler录制CPU运行堆栈,分析耗时
前置条件:AS fox最新版Android Studio Arctic Fox | 2020.3.1 Patch 3
安装App到手机上面,我这里用的是nexus 5,配置比较低。
安装好之后,打开Profiler
链接手机。
点一下CPU
区域,进入查看CPU实时状态
准备好我们要录制的场景,然后点击record
,点击按钮,进入新的act,页面看到进入后,点击stop
。
录制完成,尽可能的短,把时间刚好和页面对上。
这就是录制时间内,我们CPU执行了哪些代码的图标。
橙色
是系统调度
,绿色
是本应用,我这里手机是装了xposed,这里xposed的可以忽略。
这个图只要你鼠标移动到方法上面就会显示这个方法执行了多少时间。
我们切换到Flame
图表,看调用顺序
Log.i
占用453ms
,就离谱啊
append
占用436ms
,同样离谱了。 长得帅童鞋可能就会问了。
private void testLog() {
Log.i("gggg", "start");
for (int i = 0; i < 300; i++) {
Log.i("tagg", base64 + base64 + base64 + base64);
}
Intent intent = new Intent(this, DemoActivity.class);
startActivity(intent);
}
这哪里来的append
?
这是考基础!我们 + 拼接背后是StringBuilder.append
。我们换一个角度来看看代码。
private static testLog()V
L0
LINENUMBER 17 L0
LDC "abc"
ASTORE 0
L1
LINENUMBER 18 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 0
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 0
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 0
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 0
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L2
LINENUMBER 19 L2
RETURN
L3
LOCALVARIABLE content Ljava/lang/String; L1 L3 0
从字节码中我们可以看到testLog
的编译后的真实调用,编译器做的事情,就是字符串+拼接转换StringBuilder#append
也就是+拼接这里消耗了436ms
它包含其他api调用
这里面大头是enlargeBuffer -> arraycopy
这些都是在主线程
发生的事情了。
builder.append之后,最后输出字符串的toString
也消耗不少时间。199ms。
log.i和append和toString,这3个加起来几乎就是整个方法的耗时1.1s。
我们再看看后面的方法,已经是正常的系统耗时了。
startActivity
: 7ms,这是系统方法,我们管不着。如果你发现这个方法都超级耗时,那就得看看这个时候的CPU的负载了。
这里是很低的,属于正常。
再看看log的时候占用
就离谱了。
在我这个低配手机上,疯狂来打印,占用24%的CPU
,这个Profiler上面显示,就是本应用占用CPU情况。更何况系统还在做其他任务了。
我的设备:谷歌Nexus 5搭载2.3 GHz高通MSM8974 骁龙800四核处理器
,在点击的时候都卡了一秒才跳转。
这可是很牛逼的处理器啊,都吃了24%,在盒子上面的那个好像是单核心杂牌CPU,这个表现就是ppt了。
总结
这一个小小的log,包含不少方法。
在我的代码中,包含隐藏字符串拼接,复制,toString。
如果字符的内容少,那自然很难察觉。 要么跑到超级低配的设备上面。 这个是我们开发很容易忽略的。
至少给log工具加个开关,release的时候关掉。这是保底方案了。
这里通过分析CPU堆栈来排查问题,统计耗时的工具还有很多,比如腾讯matrix https://github.com/Tencent/matrix 滴滴的哆啦A梦:dokit 大家可以在项目中接入工具,辅助排查卡顿。
当然了,优化可以,老板得加钱!
同时感谢给我一个这么低配的盒子,无时无刻都在鞭策我不要写出卡顿的应用。阿门~~~~~~