且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PROFILER 技术总结(二): 利用Monte Carlo Profiler 工具

更新时间:2022-09-13 21:00:35

之前提到的利用微秒级精度定时器的方法测试程序的运行的效率的方法,它主要比较适于测试程序的顺序运行(如音频、视频解码效率,函数调用等),对于经常发生中断的程序和另外开辟线程连续性测试效率不是很好。因而对于这类测试,我们可以采用另一种方法测试,这种方法采用Monte Carlo Profiler工具测试。

Monte Carlo Profiler 工具是一种统计软件诊断工具,其中操作系统频繁中断,并记录下这些中断地址。从该信息中,可导出每个例程的调用次数。这种类型的分析不会测量或记录执行时间,数据也相对比较庞大(所以用我们之前写的测试时间的方法还是有用武之地的,呵呵…)。

对Monte Carlo Profiler工具的使用前的工作准备。

(一)、平台的创建

1、实验平台的构建:

       本人使用的构建平台是:Platform Builder 5.0

具体步骤如下:

1)  选择FILE | New Platform        

2)  输入名字,NEXT,在New Platform Wizart第三步中选择BSP,我选择仿真器模式(Emulator X86)

3)  NEXT,在预先选择设计模板项时可以根据你需要的选择(作为本次实验我选择Internet Aplliance)

4)  NEXT,如果设计模板选择了Internet Aplliance,则在这边只需要Internet Browser。也可以根据你的喜好自己选择,这个要求不是很严格。

5)  之后就一直NEXE下去。直至Finish,

6)  选择Platform | Settings对平台进行进一步设置

(1)、Build 类型选择Debug或Release都行,在这边我选择Debug模式(以后方便我们平台的测试)(注:   图片不能上传)

(2)、在locale选项页下,可以选择语言种类,系统默认的是英语,我们可以设置成汉语(注:有图片不能上传)

(3)、主要的设置Build Option这边,常见设置项解释如下:

-------------------------------------------------------------------------------------------------------

   Enable CE Target Control Support: 支持对实际平台的控制。可以执行 CESH 命令。
        Enable Event Tracking During Boot:在引导过程中支持事件跟踪。
        Enable Full Kernel Mode: 支持全内核模式。全内核模式参见配置文件。
        Enable Kernel Debugger: 允许调试内核。
        Enable KITL: KITL(内核独立传输层)用于在开发平台和实际平台之间相互通信。
        Enable Profiling: 能够评测内核的性能。

-------------------------------------------------------------------------------------------

我们这边要使用到Enable Profiling、Enable CE Target Control Support、Enable KITL这三个,其他可选可不选,值得注意的是:

----------------------------------------------------------------------------------------------------------

a.选上Enable CE Target Control Support后,菜单Target->Run programs/Target Control都可以用,没法调试应用程序及核心(断点失效,应用程序仅可被调用);

b.选上了Enable Kernel Debugger后,必须同时在Connectivity Options->选上 Debugger中的 KdStub! 可以调试应用程序及核心(断点处停下)。

-------------------------------------------------------------------------------------

7)  选择结束了,就可以正式开始构建平台了

在Build OS菜单下选择Sysgen,大约过10分钟左右(看机器而定我的是PD 3.0 内存1g)就能构建完成。

2、实验平台的设置:

  构建完成对实验平台的设置:

 (1)、选择 Target | ConnectivityOptions。在Target Device Connectivity Options 对话框,

      在 Download 和 Transport 框中,选择 Emulator。 

 (2)、单击 Download 框旁边的 Settings。Emulator Download Settings 对话框打开,可以设置显示大小,色彩,串口,内存。正常按默认设置。

单击OK,现在,就可以开始下载操作系统了。

3、下载操作系统

       选择 Target | Attach Device。 将操作系统映像下载到该仿真程序。操作系统下载完成后,您会看到许多显示在 Platform Builder 中DEBUG窗体中的调试消息。

(二)、使用Monte Carlo Profiler 工具测试我们的程序

要使用Monte Carlo Profiler 工具测试应用程序的效率,我们要把我们的应用程序集成到平台中去。

1、把应用程序集成到平台

应用程序的添加是在平台Sysgen之前就要建立完成,建立应用程序的方法跟我们平常建立的方法是一样的,只是这次是在Platform Builder中建立应用程序,Platform Builder也有自己一套建立应用程序的工具(其实跟EVC是一样的)。现在以我这个实验的应用程序做示例。(我是用冒泡排序做为测试应用程序)

(1)、选择 File | New Project or File。

(2)、选择 WCE Application,如下图所示。

(3)、在 Project name 框中,键入 BubbleSortTest。

  (4)、一直NEXT,之后我们选择 A simple Windows CE application。单击Finish

(5)、然后对这个project进行代码添加,我们把测试冒泡排序的程序添加到这个工程里面

上面的工程是单纯的冒泡排序算法代码,之后我们在建个同样的工程,只是这次在winmain函数的入口加入API ProfileStart(200,PROFILE_BUFFER);自己启动profile在出口ProfileStop();自己关闭profile并打印数据。这样可以达到程序自己启动和结束Profile的功能,以示区别我们把这个工程命名为BubbleSortTestAPI。

建立以上两个应用程序后,我们就可以重新构建平台了。完成之后,我们就可以进行测试了。

 

方法一:利用Windows CE Target Control 窗口使用 Monte Carlo Profiler 工具

 

由于我们在Build Option勾选了  Enable CE Target Control Support和Enable KITL(一定要选上否则用不了,一些工具的使用都要用到这个),让我们可以使用Windows CE Target Control来用命令来启动Monte Carlo Profiler。

我们可以使用以下命令:

● Prof on    //打开MONTE profile

● S  运行自己的程序  (正常都是在window目录下的,你也可以自己加路径)

● Prof off  //关闭并打印消息到output窗口

注 在关闭 Monte Carlo Profiler 工具之前,应当等待应用程序结束(如果是有交互性的程序,要等结束该程序才能prof off,由于我们的BubbleSortTest是无交互的,所以一执行完就可以prof off)

运行prof off之后就会在PB中的DEBUG窗口打印以下消息:

=================== MONTE CARLO HIT REPORT ===================

  Total samples recorded =   100053

  Total samples dropped  =        0

  Ticks elapsed          =    20010

  IDLE TIME:

     * Total non-idle samples (recorded+dropped)        =      664

     * Total idle samples (recorded+dropped)            =    99389

     * Percentage of samples in idle                    =     99.3

  INTERRUPTS:

     * Total interrupts during sample period            =   100243

     * Non-profiler interrupts                          =      190

     * Non-profiler interrupts per tick                 =      0.0

 

MODULES:  (Does not include dropped samples!)

  Module        Hits        Percent

  ------------  ----------  -------

  IDLE               99389     99.3

  nk.exe               450      0.4

  gwes.exe              32      0.0

  coredll.dll           26      0.0

  tcpstk.dll            20      0.0

  cxport.dll            19      0.0

  ndis.dll               8      0.0

  fsdmgr.dll             7      0.0

  relfsd.dll             6      0.0

  explorer.exe           5      0.0

  dc21x4.dll             5      0.0

  BubbleSortTest.exe     3      0.0

  pm.dll                 1      0.0

  shell.exe              1      0.0

  commctrl.dll           1      0.0

  ddi.dll                1      0.0

  UNKNOWN               79      0.0

 

SYMBOLS:  (Does not include dropped samples!)

  Hits       Percent    Address   Module       Routine

  ---------- ------- -------- ------------:---------------------

  99389      99.3 -------- ------------  :IDLE

  40         0.0        80270bb6  nk.exe      :_OEMCacheRangeFlush

  38         0.0       80272eed    nk.exe      :_DMAKitlSendPacket

  35         0.0       80272ff6    nk.exe      :_DMAKitlReceivePacket

  34         0.0       8024910e    nk.exe      :_KCall

  31         0.0       8024e5fd    nk.exe      :_WaitOneMore

  23         0.0       802495a9    nk.exe      :_CommonIntDispatch

  23         0.0       8024e491    nk.exe      :_WaitConfig

  22         0.0       8024e93b    nk.exe      :_SC_WaitForMultiple

  13         0.0       80265fc4     nk.exe      :_SC_KillThreadIfNeeded

  11         0.0        8024c90c    nk.exe      :_KCNextThread

  3          0.0       000110a8 BubbleSortTest.exe  :_WinMain

…………

       注:红色部分为我们要测试的程序的数据,我们可以从该信息中看出在BubbleSortTestAPI运行过程中, 所需时间的 99.3% 花费在 IDLE STATE 中,可以看出我们的程序运行效率是很高的。

 

方法二:利用API函数直接加到我们的应用程序当中,直接运行

       这种方法可以无KITL支持,就可以在DEBUG中显示相关信息。

这两个API 如下:

      ●  ProfileStart(间断时间,存储方式(就用buffer方式))                             

      ●   ProfileStop()

      运行方法:

1、直接在target wince control输入

              ●    S 自己的应用程序

              2、直接在目标机器上直接运行运用程序

       这样,也可以在PB中的DEBUG窗体中输出相应的MONTE CARLO HIT REPORT数据,效果跟第一种方法是一样的。至此利用MONTE CARLO HIT REPORT工具测试的方法也介绍完毕。


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2008/02/20/1074480.html,如需转载请自行联系原作者