2013年2月27日星期三

Fwd: Android(程序)性能分析 Traceview



Android(程序)性能分析 Traceview



  • 介绍Traceview
     “Traceview是android平台配备的一个很好的性能分析工具。它可以通过图形界面的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。”
     Traceview程序是(Eclipse)android开发环境自带工具存在...\android-sdks\tools\;
     Traceview图形界面如下: 
     
图1. Traceview界面
   

    •      a. 时间轴面板
          显示不同线程的执行情况,线上有不同颜色部分是代表线程执行不同函数。右上角显示时间轴的时间总长,左上角显示当前选中时间点的性能数据。
          注:在图形上点击鼠标拖拽就可以有放大效果,恢复原图只要双击最上面的时间轴横线即可。


    •      b. Profile面板
          纵轴显示程序执行到的不同函数。横轴显示对应函数的性能数据,包括这些字段:Incl Cpu Time %,Incl Cpu Time,Excl Cpu Time %,Excl Cpu Time,Incl Real Time %,Incl Real Time,Excl Real Time %,Excl Real Time,Calls+RecurCalls/Total,Cpu Time/Call,Real Time/Call。
          大体上介绍一下以上字段含义:
          Incl是Inclusive(包含的),表示该函数的调用包括所有子函数的调用。
          Excl是Exclusive(独有的),表示该函数的调用仅包括基本操作,不包括子函数的调用。
          Cpu Time,就是真正在占用CPU的时间,Elapsed Real Time = CPU Time + Wait Time。详细参考http://en.wikipedia.org/wiki/CPU_time
          Real Time,就是时钟计时的时间(时长)。
          "Elapsed real time is always same or more than CPU time for computer program which use only one CPU for processing. If no wait is involved for I/O or other resources, elapsed real time and CPU time are very similar."
          %,占有的百分比。
          所以,字段“Incl Cpu Time %”就表示对应函数的Cpu Time在整个时间轴的函数调用中占的百分比。


    •      c. 搜索框

     搜索框根据函数名称搜索显示对应的性能数据。

还有,可以参考Traceview 官网说明 http://developer.android.com/tools/debugging/debugging-tracing.html


  • 抓取分析数据
     上面内容介绍了Traceview工具,光有工具而没有分析数据,哪来的性能分析。所以这部分内容讲述抓取分析数据。
    该部分说明如何抓取分析数据,即创建分析数据文件(Trace File)。其方法有三种:

    •      1. 使用Eclipse的DDMS功能
         该方法是最简便也最实用,没有之一。而且不需要去修改代码也不管程序是否有读写SDCard权限(如方法2)。具体操作如下:
          a. Eclipse切换至DDMS页面,选中需要分析的程序(如xlwireless.wirelessadhocnetwork),点击右上角按钮“Start Method Profiling”,如下图:

          
图2. DDMS启动Traceview

          b. 停止操作时点击同一按钮,则Eclipse会自动弹出中Traceview图形界面,直接显示了Trace(文件)的分析结果。
          c. 若想保持分析数据(trace文件),只要操作Eclipse菜单File -> Save As ... 即可。
          的确是实在太简洁的操作吧!

          注意:该方法不支持Android 1.5设备,Android 2.1或更早版本需SDCard机器权限,而Android 2.2之后即使没有SDCard也行。(引用自官方说明)
    • If you are using DDMS, Android 1.5 devices are not supported.
    • If you are using DDMS, Android 2.1 and earlier devices must have an SD card present and your application must have permission to write to the SD card.
    • If you are using DDMS, Android 2.2 and later devices do not need an SD card. The trace log files are streamed directly to your development machine.


    •      2. 使用Debug Class代码添加功能
         MainActivity的OnCreate方法添加:
  Debug.startMethodTracing("xl-adhoc-trace");
         MainActivity的OnDestory方法添加:
  Debug.stopMethodTracing();
         或者,你也可以换成在MainActivity的OnStart与OnStop方法。有人出现这样情况:“但是在实际的测试时发现这种方式其实并不好用,因为通常情况下我们的activity的onDestroy()是由系统决定何时调用的,因此可能等了很长时间都不会得到这个trace文件。因此决定在onStop()中来调用Debug.stopMethodTracing()。这样当我们切换到其它activity或者点击home键的时候onStop()就会被调用,我们也就可以得到完整的trace file。”

        使用该方式获取trace数据需注意:程序须有SD卡读写权限,当然还有代码权限。
        程序运行结束后,会在SD卡下生成对应trace文件(如xl-adhoc-trace.tracing),使用adb pull命令拉取trace文件或其他可视化拷贝都可以。


    •      3. adb 命令行启动
        命令如下:
         adb shell am profile start
         adb shell am profile stop
        但该方法没有去做过尝试。



  • 分析性能
     工具 + 数据 = 分析结果

     通过已保存有的trace文件,用命令行启动Traceview分析程序性能。
     1. 把Traceview目录添加到系统的环境变量Path,如c:\users\<user-name>\android-sdks\tools\;
     2. CMD命令行:traceview  ***.trace (注意:全路径的trace 文件,否则可能不行)。
     3. 自动弹出traceview图形界面,通过这个图形界面就开始分析程序的性能。

     结合图形,做简单的示例分析:
     a. 日志版的自组网程序刚启动时间(2s左右)的性能结果:
         
         从上图分析结果:打印日志的逻辑占了程序性能很大比例。

     b. 非日志版分享文件时的性能结果:
          
          从上图分析结果:可以优化的地方包括Wifi列表更新操作的refreshWifiScanResult,文件分享(发送方)的onRequestFileRange。


  •      具体函数的分析
          针对分享文件数据(上图的)详细分析一下,查找refreshWifiScanResult与onRequestFileRange函数在具体地方占用其性能比例在哪里?
          见下图显示,用红圈标注出了性能的关键地方。
          
          
          
          

     
(完)

2013年2月26日星期二

Fwd: 2013春节故事2(图文)

2013春节故事2(图文)


  • 溪边洗涤.逝去的农村生活习惯

20130207 往外公家,路过小溪,在拱桥上看到桥下一位不识的老妇在溪边洗衣,竹篓、木槌、肥皂。顿然,感慨这种农村以前的陈旧生活习惯,小时候比较常见农村妇人在溪边洗涤,而随着生活水平提高妇女们早已方便在家洗涤。久违这样的画面了。


  • 奖状.向五老同志致敬

20130207 "革命传统发扬光大,四化建设再展宏图",外公的奖状,其年纪比我大。外公曾说过以前他是某团重要通信员,后来回家与外婆结婚就没有再回去参军也就没了更好发展了,一直在老家当农民(村干部),再后来都成了地方的高级领导……是不是说,那年代的淳朴的战士,或许现在有人说憨厚无知,今非昔比,如今物欲横流。

  • 枯黄芭蕉叶.季节的痕迹

20130209 (图,外公家门前的枯黄芭蕉叶)十月那会鲜绿的芭蕉叶,短短数月,如今枯黄凋零。岁月,一把无形杀猪刀。冬天已来过,留下了烙印,春天还远吗?


  • 残墙断壁.岁月的痕迹


20130209 (残墙断壁) 外婆家门前的"残墙断壁",谁说岁月无痕?小时候还是一座完好的小土(圆)楼,二十年前的一场火灾狠狠摧残了它,再经过人们这么多年的摈弃,如今这般只剩一面断墙...


  • 桃花朵朵开.好运相随


20130212 (图,桃花花开好时节) 春风习习,桃花朵朵开。看,春天的脚步已悄悄到来...


  • 鸭子与炮竹碎纸.新年氛围


20130212 (图,鸭子与炮竹碎纸) "春江水暖鸭先知"人过年,它也过年,新年快乐!


  • 乡村画面.自然美


20130212 一幅乡村景色画面。在乡村,这样的景色很自然而常见,美。黑云、白云、一线蓝天、群山、雾气、水泥路、一条公狗……


  • 红艳艳三角梅.红红火火


20130214 某伯伯院里的三角梅,正是花开好时节,红红火火。补充(20130216):刚好,那天是情人节,都过了两天了,我才知道,真是无情人便空情调了!顺祝新年好运,桃花朵朵开。


  • 祠堂祭拜.光宗耀祖


20130213 我在老家祠堂祭拜,纯属打酱油般摆摆Pose!"光宗耀祖"
20130213 中午,父亲把我叫到单独的地方,带着比较严肃表情说:"前天晚上我做了个梦...就想你这几天还是不要出门了好!",我被惊讶到了,他没具体说什么梦,我也没再问什么但大概明白意思,就以简单的"嗯噢"答应了他。正好也就不再考虑这两天外出游玩的打算...好像从来没直面过父亲迷信的一面,唉天下父母心,顺其心意,彼此安然。顺祝新年一家幸福安康! 


  • 公路上2B大兵.童趣无邪


20130213 年度最佳2B小弟,大马路上冒充大兵,话说装备齐全!

  •  翠绿的嫩叶.茁壮成长


相濡以沫或相忘江湖,也就就那么一念之间。


Fwd: 2013春节故事1(图文)

2013春节故事1(图文) 


回家车票.过年回家难能可贵
20130205 过年回家汽车票,深圳回厦门而路过漳州即下车回家。


  • 回到漳州.蹊跷的故事 
20130206 今天漳州的雾气真大,能见度估计不超过50m,直接导致高速封路了,汽车半路下高速走国道了,这事正好帮我促成一个蹊跷。该用何种心情表达呢?暗自偷着笑说"运气有加"。蹊跷...
放假回家,买的回厦门车票,坐过几次都可在漳州下车。不知何故这次情况有变,俩司机都说不行了就不让下了,苦求了也没用,人家态度还不友好(希望高铁顺利开通吧还有争取自己早日有四轮的)。算了死心了就麻烦点呗,心想"到了厦门再折回家吧",然后安心睡...六点半醒来一看,居然下高速了??
 
 



  • 回到漳州.我在姑妈家
20130206 姑妈家,香榭花都。
 



  • 锯木头.孝顺的外孙

20130206 回到老家芦溪那天傍晚,探望外公,老人家今年八十七,我从他手中抢过锯子,在外公家帮忙锯木头。
 


  • 微波肉肠.乡村过节美食

20130206 晚上家里帮忙老妈在家坐肉肠。农村家乡习俗,过年挨家挨户都做自己的肉肠,原材料肉、番薯粉、蒜、高粱酒、胡椒等其他调料。其实,比较简单但美味,尤其刚刚正数出炉时候,不过吃多了当然也会厌的!



  • 打鸭血.过节打鸭血打鸡血
20130218 (图,打鸭血过年回家,各种打鸡血打鸭血的,满满的,老家的习俗杀鸡宰鸭的。大年三十、春节,正月初九,元宵都是老家农村在大节,节前的一两天到处流行各种打鸡血,打鸭血。不要说残忍,^_^ ...



  • 贴门对联.一帆风顺蛇年大吉

20130209 除夕,过大年贴春联。图,堂弟阿辉贴横批一帆风顺。去年开始就过年贴春联的差事就开始交给阿辉阿升两小弟了。以前十几年时间都是我跟阿森在忙活这事,曾经有玩得开心也有枯燥无味。




  • 窗户对联.浓浓过年气氛  

20130211 正月初二出门做外甥外孙探亲,初二探亲是悠久习俗。图,小窗户的小对联,农村老人家(外公家)的春节气氛。