Android Performance(2) Traceview
http://blog.csdn.net/liaoqianchuan00/article/details/23528947
TraceView可以用来调试你的程序,用来分析你程序的performance。
1. 当运行程序的时候,进入ddms,选中需要trace的进程,然后点击下图红框的位置就启动了trace,再点一下就会停止,并且自动打开traceview面板。
2. 在代码中使用Debug类的相关方法,方便我们对特定部分代码进行分析。这个时候我们需要在manifest中添加权限READ_EXTERNAL_STORAGE。
// start tracing to "/sdcard/calc.trace"
Debug.startMethodTracing("calc");
// ...
// stop tracing
Debug.stopMethodTracing();
接着将calc.trace文件拷贝到电脑上
adbpull /sdcard/calc.trace /tmp
用traceview打开trace文件
traceview /tmp/calc
如上图所示,每行表示一个线程的执行情况。
l 每行随时间向右递增,
l 每个方法用一种颜色表示,但是这些颜色是循环使用的。我们看见黑丝区域里面又有其他颜色,在这里黑色是parent函数,里面的其他颜色表示他的子函数。
l 并且我们的timeline界面可以放大缩小(mac两个指头拖),可以看得更细。
如上图所示,简要概述了这个方法花费时间的情况。这个表显示了inclusive和exclusive时间,包括时间占用百分比和实际花费时间,还有调用次数等信息。
l Exclusive时间表示的是函数本身调用的时间,
l inclusive时间表示的是函数本身调用的时间和所有子函数的时间。
l 在左侧展开一个函数名字,可以看见里面分成parents和children。
l 右侧的Call+RecurCalls/Total列显示了这个函数被调用的次数。即:调用次数 + 递归调用次数这个函数里调用次数/这个方法总共被调用次数。
l CPU Time/Call 平均每次的调用时间。
1. 重写ArrayAdapter的getview方法
@Override
publicView getView(int position, View convertView, ViewGroup parent) {
Log.d("==========", "get position: " + position);
Debug.startMethodTracing("getViewOfTrace");
// Ensure sorted values
new Thread(new Runnable() {
@Override
public void run() {
Collections.sort(values);
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}).start();;
Collections.sort(values);
LayoutInflater inflater = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view =inflater.inflate(R.layout.rowlayout, parent, false);
Resources res = context.getResources();
String text =String.format(res.getString(R.string.number_template),
values.get(position));
CharSequence styledText =Html.fromHtml(text); TextView textView= (TextView) view.findViewById(R.id.textView3);
textView.setText(styledText);
Debug.stopMethodTracing();
return view;
}
2. 从device上取出trace文件进行分析
可以看见在timeline面板上,有两个线程,1是我们的主线程,17是我们在getView中启动的线程。
在Find中输入run, 按回车可以在匹配run的方法中切换,切换到MyArrayAdapter$1.run停止。这个就是我们在getview中启动的线程。Parent是Thread.run。Children中有sort,sleep等。
l Incl CPU Time = 5.598 = 0.011 + 5.576 + 0.007 + 0.004=所有children的和
l Excl Cpu Time = 0.011 = children中self的值。
l 查看children中sort的Call+RecurCalls/Total项,1/2,表示这里被调用了1次,但是总共这个函数被call了两次,因为在getview中还调用了一次。