Android Performance(2) Traceview

来源:互联网 发布:java一年工作经验简历 编辑:程序博客网 时间:2024/05/16 06:10

Android Performance(2) Traceview

http://blog.csdn.net/liaoqianchuan00/article/details/23528947

概述

TraceView可以用来调试你的程序,用来分析你程序的performance。

 

生成trace文件

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

 

 

Timeline 面板


如上图所示,每行表示一个线程的执行情况。

l   每行随时间向右递增,

l   每个方法用一种颜色表示,但是这些颜色是循环使用的。我们看见黑丝区域里面又有其他颜色,在这里黑色是parent函数,里面的其他颜色表示他的子函数。

l   并且我们的timeline界面可以放大缩小(mac两个指头拖),可以看得更细。

 

Profile面板

如上图所示,简要概述了这个方法花费时间的情况。这个表显示了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中还调用了一次。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 兔子吃了蟑螂药怎么办 兔子洗了澡要死怎么办 养的花蔫了怎么办 养的小鸡很大了怎么办 养的小兔子死了怎么办 小狗出现爬跨行为怎么办 养的小狗总做吞咬人的行为怎么办 螃蟹和柿子一起吃了怎么办 指甲上月牙没了怎么办 手指上月牙没了怎么办 指甲上没半月牙怎么办 电动车车牌被偷了怎么办 警察拖车拖坏了怎么办 6岁儿童牙疼怎么办 小白单车不退押金怎么办 光盘放笔记本电脑里读不出来怎么办 cd光盘读不出来怎么办 最近脸干的不行怎么办 脸感觉干的不行怎么办 新生儿睡觉黑白颠倒了怎么办 婴儿吐水和奶花怎么办 刚刚出生的宝宝拉肚子怎么办 刚出生的婴儿拉肚子怎么办 新生儿5天拉稀水怎么办 10个月孩子拉肚子怎么办 不满月的宝宝拉肚子怎么办 一周岁宝宝发烧腹泻呕吐怎么办 6个月宝宝37度怎么办 1岁宝宝发烧37.2怎么办 新生儿发烧37度3怎么办 两个月宝宝抵抗力差怎么办 6月宝宝着凉拉稀怎么办 六个月的宝宝拉肚子怎么办 衣服颜色太深了怎么办 一多半宝宝爱喝水不爱吃饭怎么办 十个月宝宝不爱吃饭怎么办 十个月宝宝突然不爱吃饭怎么办 二十个月宝宝不爱吃饭怎么办 十个月的宝宝不爱吃饭怎么办 6年级学生数学差怎么办 打印机打不出来就是一张白纸怎么办