VC++ 性能分析器的 VB 前端、Excel 和 PROFILER





0/5 (0投票)
2001 年 2 月 6 日

113355

841
一个有用的工具,
引言
VC++ 拥有出色的内置性能分析器,但为了遵循产品的(表面上的)设计理念,微软并未为该功能提供一个友好的图形用户界面,而是倾向于提供可定制的灵活底层功能。一个相关的工具是位于 VC98/Bin 文件夹中的宏,名为 PROFILER.XLM。此宏可以将性能分析器输出处理器程序 PLIST.EXE 的制表符分隔的文本输出,并将其呈现为 Excel 图表,显示函数计时或命中次数。缺点是此功能使用起来有些麻烦,因此我个人发现自己有些不愿使用它。
VB 是一个理想的工具,可以制作一个简单的前端来自动化此类过程。我注意到一些人对使用 VB 持抵触态度,他们认为自己是“真正的”程序员(参见 CodeProject 上最近的讨论)。我觉得这很有趣。基于某种优越感的盲目偏见会自食其果,仅仅因为这会限制一个人的视野。我想一个“真正的”程序员会宁愿使用命令行选项来运行此过程,或者使用 VC++ 解决方案……但这花费了两天时间,而我之前从未接触过 VB/Office 接口。VB 有其用途——这个小程序对我有用,我猜想其他人也可能会觉得它有用。
使用 PROFILER.XLM 宏
在 VC++ 开发环境中运行性能分析器的过程在 VC++ 程序员指南的“性能调优”部分有介绍。在“使用 PROFILE、PREP 和 PLIST”以及“使用 PROFILER.XLM 宏”标题下可以找到更详细的信息。此处概述了该过程。
通常,在收集函数计时/命中次数信息时,您不希望收集整个程序的数 据,而是从某个特定函数开始,并包含它调用的函数。为此,您首先需要在“项目/设置/链接”属性页中选中“启用性能分析”和“生成 Map 文件”框,然后创建应用程序的调试版本。构建项目后,您需要在 /Debug 文件夹中搜索 .map 文件,找到所需起始函数的装饰名称。(VC++ 程序员指南中的几个条目描述了装饰名称。)选择“生成/性能分析”以打开性能分析器对话框。选中“函数计时”,然后输入“/SF”(即斜杠 S-F 后跟一个空格),以及装饰函数名。生成的条目看起来会像这样
/SF ?DrawObjects@CGLDisplay@@AAEXW4TRenderMode@@@Z
单击对话框中的“确定”按钮将启动在性能分析器控制下的应用程序。执行任何您想进行的以测试被分析代码的操作,然后退出应用程序。原始函数计时和命中次数数据将出现在 VC++ 输出窗口中,按时间排序。现在打开一个 DOS 命令窗口。必须使用“/t”选项运行程序“PLIST”,以生成适合导入 Excel 的制表符分隔文本输出。语法类似于“PLIST /t inputpath > outputpath”,其中 inputpath 是 PREP 生成的 .pbt 文件的位置(默认情况下是项目的 /Debug 文件夹),outputpath 是制表符分隔文本文件的期望位置。
此时可能会遇到一个麻烦。PREP、PLIST 和 PROFILE 位于 VC98/Bin 文件夹中。一个必需的 DLL,mspdb60.dll,默认情况下不在 PREP 可以找到的路径中(至少在 VS 6.0 SP3-4 中是如此)。我相信在安装时运行 VC++ 环境变量选项可以解决此问题,但如果您收到“文件未找到”错误,只需将 mspdb60.dll 复制到 VC98/Bin 文件夹中。
一旦生成了制表符分隔的文本文件,打开 Excel,然后选择“文件/打开”,导航到 PROFILER.XLM 宏。打开它。再次选择“文件/打开”,然后导航到制表符分隔的文本文件。打开它,使用默认选项处理制表符。数据将被加载到 Excel 并进行处理。现在通过按 Ctrl-T,将生成一个类似下图所示的计时图。按 Ctrl-C 将生成一个类似的带有命中次数数据的图。
正如我所说,这是杀手级的结果,但生产过程有点麻烦。
VB 前端
如果您已经按照前面的说明进行操作,这将相当简单。使用 VB 驱动器列表框、目录列表框和文件列表框组件,找到您想分析的应用程序的调试版本。(注意——您仍然需要像上面描述的那样,创建启用性能分析和 Map 文件生成的调试版本。)在指示的位置输入所需的起始函数名,然后按“搜索”。程序将在 .map 文件中查找并提取包含搜索字符串的所有装饰名称。选择一个装饰名称,然后按“运行性能分析器”。程序将在 /Debug 文件夹中创建一个批处理文件,其中包含运行性能分析器序列所需的代码,然后执行它。VB 前端会最小化到任务栏,应用程序将运行,然后您执行任何必要的任务来测试您正在分析的代码。当您准备好时,退出被测应用程序,通过单击其任务栏图标来恢复 VB 应用程序,然后选择所需的输出,方法是单击剩余的按钮之一。按任意一个“图表”按钮都将打开一个 Excel 实例,打开 PROFILER.XLM 宏文件,打开 PLIST 生成的文本文件,并创建相应的图表。您可以在不重新运行性能分析器的情况下切换图表。通过单击“查看排序文本输出”按钮,您可以看到原始 VC++ 开发环境输出窗口中的数据格式,并且可以按时间或命中次数排序,具体取决于您选择的 Excel 视图。(如果您没有选择 Excel 图表,它将默认按时间排序。)可选地,如控件所示,您可以启用“调用属性”数据收集。这将改变文本输出的计时排序,以便更清晰地显示哪些函数被谁调用,以及花费了多少时间处理来自特定函数的调用。(MSDN 中有一篇关于使用“调用属性”选项处理装饰函数名长度超过 255 个字符的问题的错误报告——您可能想知道这一点。)
实现细节
- 创建/销毁的文件——如前所述,将在 VC++ 项目的 /Debug 文件夹中创建一个批处理文件,其中包含运行性能分析器作业所需的命令。此文件名为“xcelprof.bat”,在程序退出时会被清理。馈送给 Excel 的制表符分隔文本输出文件名为 excel_profile.txt,也位于 /Debug 文件夹中。它被保留以供进一步查看。同样,通过单击“查看排序文本输出”创建的排序文本文件也在 /Debug 文件夹中。它名为“profile.txt”,并被保留下来。
- 默认工具目录——如果您选择了 Visual Studio 的默认安装选项,PLIST、PROFILE 和 PREP 都位于 c:\program files\microsoft visual studio\vc98\bin\。如果您将它们放在其他地方,则需要修改 VB 源代码顶部的字符串常量 strToolDir。
- Excel 兼容性问题——我使用 Win2K Pro SP1、VS6 SP4 和 MS Office 2000 SP1 组合了此功能。我对其他版本的 Excel 不够熟悉,无法确定它是否会起作用,但如果不起作用,我怀疑是由于打开 PROFILER.XLM 和制表符分隔文本文件所需的代码存在差异。如果这是一个问题,解决方案很简单。受影响的代码位于 VB 函数“btnTimingClick()”和“btnHitCountClick()”中,并附有注释。该代码片段是使用 Excel 内部的“记录宏”选项创建的,然后执行打开文件并创建图表所需的序列。很简单,不是吗?
- 注册表项——程序会记住最后测试的 .exe 文件以及最后分析的函数名称。此信息存储在注册表的 Current User/Software/VB and VBA Program Settings/VC++-Excel Profiler 下。
- VB 运行时 DLL——这些文件未包含在 zip 文件中。