systrace 的log中标签时间计算原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaobai_ol/article/details/56966051

在Android的性能优化上,大多数人都会用到systrace来抓取应用的启动过程,分析过程中哪些帧数绘制过长或者卡顿等其他原因。抓取的结果是以html形势展现的,而这里要讲的,其实跟Android没有多大关系,只是说抓取的html中,各个标签的时间是怎么得出来的。

当你点击其中的某一个标签,比如应用启动时绘制的activityStart标签,下面就会显示这个标签的时间或者使用键盘的按键“M”,该html就会把这个标签的时间区间显示出来,并在上面显示这个区间的所消耗的时间,那么这个时间是怎么得出来的呢,

首先我们知道计算一段时间,其原理是得到它的开始时间与结束时间,然后两个时刻相减,就是其所耗费的时间了。其实systrace中也是这样,当你把抓取的systrace当作一个文本时或者说查看这个网页的源码时,可以看到里面是许多的js‘语句等,拿activityStart标签来说,当你搜这个关键词时,会搜到有一行,是以activityStart结尾的,如下:

   ‘com.android.calendar-31028 (-----) [003] ...1 24087.505551: tracing_mark_write: B|31028|activityStart’

可以看到这一行后面的B|31028|activityStart”,这个大写的“B”,其实是begin’的缩写,也就是说,这一行就是activityStart的开始时间标签行,(31028是这个包对应的应用在手机系统中的线程标号,)其实它的开始时间就是这一行中间那一长串的实数24087.505551

好了,得到了它的开始时间了,那该标签的结束时间呢,其实你会看到从开始时间行到下面一些行,他们的结尾有些有个大写字母“E”,例如:

      com.android.calendar-31028 (-----) [003] ...1 24087.505639: tracing_mark_write: E

同理。这个E的意思就是end的意思,也就是含有E结尾的时间行都是结束时间行,但是却不知道这个结束时间行是哪个结束时间行,因为结束时间行,根本就没有带标签的名字。那么问题来了,怎么得到activityStart得结束时间行呢?

其实,这里运用了一个数据结构,栈的·思想。可以这样理解,从activityStart开始时间行开始,遇到B的就入栈,遇到E的就出栈(这里结束时间行必须与开始时间行最前面的头要相同,即包名或者线程名要一致)。这样,当·activityStart的开始时间行要出栈时,让它出栈的结束时间行中那个长串实数,就是该标签的结束时刻。然后提取出开始时间与结束时间,就可以得出这个标签的时间啦。其他标签的时间计算也是这一原理。

猜你喜欢

转载自blog.csdn.net/xiaobai_ol/article/details/56966051