使用独立的CPU剖析器
为了模拟对CPU的过高占用率,我们在样例工程的main.cc文件的return语句之前增加如下两行代码:
// waste time
wasteCpuCycles();
return app.exec();
wasteCpuCycles()函数将通过如下浮点数除法的方式消耗时间:
void wasteCpuCycles()
{
size_t count = 10000000;
double result = 0;
for (size_t i = 0; i < count; i++)
{
result += i / 2.33;
}
qDebug() << QString("Wasted %1 divisions, result=%2") .arg(count).arg(result);
}
首先,我们尝试一下Very Sleepy剖析器。可从GitHub - VerySleepy/verysleepy: Very Sleepy, a sampling CPU profiler for Windows下载安装,安装在本书写作时,最新的发布版本v0.90不能读取较新的MinGW编译器产生的调试信息,你需要下载还没有正式发布的0.91版本的开发版本。你可以在Readme.md的Download部分找到指向AppVeyor的生成包(artifact)(我用的是v0.90-154-g3220232)的链接。该链接中包含了安装文件,可直接安装,使用所有的默认选项。当启动了该剖析器后,可以将其附着到左侧列表中的一个正在运行的程序,也可以点击File | Launch选择启动一个应用程序,如下图所示:
Fig. Very Sleep运行界面你会发现需要指定可执行程序及其工作目录,工作目录可直接使用应用程序所在目录。点击Launch之后,应用程序将在profiler的控制之下启动起来,如下图所示:
Fig. Very Sleepy控制下的Qt样例程序的运行当你收集了所需的剖析数据后,在Very Sleepy对话框上点击Stop按钮。剖析器将分析数据,并将其显示在另一个窗口,如下图所示:
Fig. Very Sleepy的剖析结果展示我们可以看到Very Sleepy找到了浪费CPU资源的模拟函数,并且将它显示为最消耗CPU的非系统函数。在下部的面板中,源代码按行显示出来,每行标注了采样时间。显而易见,大多数的时间消耗在了浮点数操作上,部分消耗在了循环体上。
接下来,让我们尝试一下CodeXL的CPU剖析支持。可以访问https://github.com/GPUOpen-Tools/CodeXL/releases/tag/v2.5或者从产品页面(https://gpuopen.com/compute-product/codexl/)下载Windows安装文件(CodeXL_Win_2.5.67.exe)。安装CodeXL, 并用CodeXL启动应用程序。
为了剖析样例应用程序,需要通过File | New Project创建一个新工程,填写可执行程序的位置。然后,通过点击工具栏上的CPU Profile小图标开始剖析。当你认为已经收集到了必须的剖析数据之后,点击CPU Profile小图标边上的长方型小图标停止采样。CodeXL将收集数据并显示在一个新的剖析会话中,如下图所示:
Fig. CodeXL的CPU剖析窗口我们将发现浪费CPU资源的模拟函数出现在了第一行。这是因为CodeXL默认会过滤掉系统函数。在另外的几个视图中,数据将用不同的方式组织。然而,CodeXL似乎无法显示函数源码,而只能在Source/Disassembly页签显示汇编代码。即便如此,这些汇编指令也被标注了采样率,对我们理解汇编代码的运行情况很有帮助。
网友评论