Android Performance(2) Traceview

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值