您的位置:首页 > 编程语言 > C语言/C++

C/C++ 性能分析 - NetBeans IDE 6.8 教程

2013-03-01 20:24 211 查看

C/C++ 性能分析 - NetBeans IDE 6.8 教程

撰稿人:Susan Morgan

2009 年 12 月 [修订版本号:V6.8-1]

目录


要求
简介
将 Sun Studio 工具添加到 NetBeans IDE
创建用于本教程的 C/C++ 项目
设置项目属性
生成和运行性能分析演示项目
使用指示器控件
浏览 CPU 使用情况
浏览内存使用情况
浏览线程使用情况
管理性能分析配置
另请参见
小结

要求

要学习本教程,您需要具备以下软件。

软件要求的版本
Solaris 或 Linux 操作系统OpenSolaris、Solaris OS 版本 10、近期的 Linux 版本
NetBeans IDE(支持 C/C++)版本 6.8
Java Development Kit (JDK)版本 6 或版本 5
C 和 C++ 编译器、make、gdb经测试可以与 NetBeans IDE 配合使用的 C/C++ 工具集合
请参见 NetBeans IDE 6.8 安装说明配置 NetBeans IDE 以使用 C/C++/Fortran

以获取有关下载并安装所需软件的信息。

简介

带有 C/C++ 插件的 NetBeans IDE 6.8 提供了一些工具,可用于在项目运行时对其进行观察,使您能够检测到应用程序中的运行时问题。这些类型的问题无法在调试代码时检测到。C/C++ 性能分析工具包括:

CPU 使用情况
内存使用情况
线程使用情况
I/O 使用情况,仅在 Solaris 平台上可用
线程微状态,仅在 Solaris 平台上可用

这些工具在图形中显示使用情况信息并包含一些按钮,可单击这些按钮以显示有关应用程序中的问题区域的更详细信息。

本教程介绍如何使用 NetBeans IDE 性能分析工具分析 C/C++ 项目,并重点介绍 CPU 使用情况、内存使用情况和线程使用情况工具。

Solaris 操作系统上 C/C++ 项目的 I/O 性能分析中介绍了 I/O 使用情况工具。

在 Solaris 操作系统上使用线程微状态工具中介绍了线程微状态工具。

NetBeans C/C++ 性能分析的平台支持

在 Solaris、OpenSolaris 和 Linux 操作系统上运行 NetBeans 项目时,将会自动运行 C/C++ 性能分析工具。性能分析工具使用运行项目的操作系统中所运行的外部工具,收集有关项目运行时的信息。Windows 或 Mac 平台上不提供收集详细信息所需的工具。

本教程使用在具有 Sun Studio 工具且基于 SPARC 处理器的 Solaris 系统上运行的项目。不过,Solaris 平台上并不要求使用 Sun Studio 工具集合,因为性能分析工具也可以使用 Solaris DTrace 实用程序获取运行程序的相关信息。如果使用的是 OpenSolaris 操作系统,可通过包管理器或在终端窗口中使用
pkg install sunstudio 命令,方便地安装 Sun Studio 软件。

如果使用的是 Linux 平台,则必须下载 Sun Studio 软件才能在 NetBeans IDE 中使用 C/C+ 性能分析工具。可以从以下位置免费下载 Sun Studio 工具:http://developers.sun.com/sunstudio

下表显示了支持 C/C++ 性能分析工具的操作系统和工具集合。

 SolarisLinux注释
CPU 使用情况

在 Linux 上,需要安装 Sun Studio 工具。
内存使用情况

在 Linux 上,需要安装 Sun Studio 工具。
线程使用情况

在 Linux 上,需要安装 Sun Studio 工具。
I/O 使用情况

使用 Solaris DTrace,但不使用 Sun Studio 工具。
线程微状态

使用 Solaris DTrace,但不使用 Sun Studio 工具。
如果您使用的是 Windows 或 Mac,并且您可以访问某个运行 Solaris、OpenSolaris 或 Linux 的系统,请注意,您可以在 Windows 或 Mac PC 上以本地方式运行 IDE,然后进行设置以在 Solaris、OpenSolaris 或 Linux 系统上进行远程开发。远程开发可使您即使在 Windows 中运行 IDE 时也能使用性能分析工具。有关如何进行设置以在远程开发主机上生成项目的详细信息,请参见
C/C++ 远程开发教程

将 Sun Studio 工具添加到 NetBeans IDE

如果在安装了 NetBeans IDE 之后安装 Sun Studio 工具,或者 Sun Studio 工具未包含在 Path 变量中,则可能需要向 IDE 提供 Sun Studio 工具所在的位置,如以下步骤中所述。如果不使用 Sun Studio 工具,则可以跳过此步骤。

选择“工具”>“选项”。
在“选项”对话框中,单击对话框顶部附近的 "C/C++"。
单击“生成工具”标签。在此标签中,“工具集合”将显示在当前开发主机上找到的工具集合。缺省集合以粗体列出,并且对于所创建的任何新项目,都会使用该集合。
选择要添加工具集合的开发主机。在此示例中,将在 Solaris 本地主机上运行 IDE。
单击“工具集合”列表下的“添加”。
在“添加新工具集合”对话框的“基目录”文本字段中,键入 Sun Studio 工具集合的基目录路径,或使用“浏览”按钮导航至 Sun Studio
bin
目录的路径。Sun Studio 很可能会安装在
/opt/sunstudio12
/opt/sun/sunstudio12

/opt/SUNWspro
中,具体取决于 Sun Studio 的版本以及操作系统。
如果“开发主机”不是 "localhost",则无法使用“浏览”功能导航至工具目录。对于位于远程服务器上的工具,必须键入其基
bin
目录的完整路径。单击“检查”可使 IDE 检查输入的路径是否对支持的工具集合有效。

将自动填写“工具集合系列”和“工具集合名称”。可以根据需要为工具集合指定不同的名称。


单击“选项”对话框中的“确定”。

创建用于本教程的 C/C++ 项目

为了说明 C/C++ 性能分析功能,我们将通过 IDE 中包含的性能分析演示样例应用程序创建一个新项目。

选择“文件”>“新建项目”以打开“新建项目”向导。
在该向导中,选择“样例”类别,然后选择 "C/C++" 子类别。
选择图中显示的“性能分析演示”样例,然后单击“下一步”。



可以根据需要选择该项目的名称和位置。我们将使用缺省的 ProfilingDemo_1 作为项目名称,以及使用缺省的 NetBeansProjects 目录作为项目位置。

单击“完成”退出向导并创建项目。

设置项目属性

右键单击“项目”标签中的 "ProfilingDemo_1" 项目节点,然后选择“属性”。
选择“类别”面板中的“生成”节点。
选择 "SunStudio_12" 作为工具集合,然后单击“应用”。



选择“类别”面板中的“运行”节点。对于“控制台类型”,选择“输出窗口”并单击“应用”。这样,就可以在 IDE 的“输出窗口”而不是外部终端窗口中查看程序输出,如本教程中所示。



选择“类别”面板中的“配置文件”节点。选择“在运行过程中显示性能分析指示器”。
对于“性能分析配置”,选择“C/C++ SunStudio 标准”。



单击“性能分析配置”列表旁边的 "..." 按钮以打开“Profiler 工具管理器”对话框。请注意,为“C/C++ SunStudio 标准”配置选择了线程使用情况、内存使用情况和 CPU 使用情况工具。如果选择其他性能分析配置,则会看到为每种配置选择了不同的工具组合。在本教程中,我们使用的是“C/C++ SunStudio 标准”配置。



在“Profiler 工具管理器”中单击“取消”,退出而不进行任何更改。
在“项目属性”对话框中单击“确定”。

生成和运行性能分析演示项目

右键单击性能分析演示项目节点,然后选择“生成”。
“输出”标签将显示生成的结果,如下所示。




请注意,编译器是 Sun Studio C 编译器 cc。可以安全地忽略参数不匹配编译器警告。
右键单击性能分析演示项目节点,然后选择“运行”。
将会打开“运行监视器”标签以显示指示器以及 CPU 使用情况、内存使用情况和线程使用情况的动态图形。




请注意,在输出窗口中,性能分析演示程序将告诉您所执行的操作,这样您就可以将其与 IDE 在工具中以图形表示的数据进行比较。例如,程序会显示其分配了多少内存,并且还会执行计算,然后释放内存。您可以看到该图反映了程序的活动。
在每次出现提示时按 Enter 键,直至程序完成。
将鼠标光标放在指示器上,以查看解释每个图形所代表的内容的工具提示。
每个指示器包含一个用于显示更详细信息的按钮,我们将在本教程后面介绍该按钮。首先,我们应了解指示器控件。

使用指示器控件

在“运行监视器”窗口底部,可以看到用于控制图形视图的滑块:视图滑块、详细信息滑块和时间滑块。下面的屏幕快照中标记了这些滑块。将鼠标光标放在滑块端点上以显示滑块的相关信息。



单击时间滑块(位于底部的水平滚动条)并按住鼠标按钮,向左拖动滑块以查看开始运行时的情况。所有图形将一致地滑动,因此,可以看到各个区域(CPU、内存和线程)在特定时间发生的情况以及查看它们之间的关系。

从左向右拖动时间滑块以查看完整运行情况。
将鼠标指针移到视图滑块(与时间单位重叠的控件)。通过使用视图滑块控件,可以选择在指示器中显示的运行时间部分。
单击并拖动左侧视图滑块的控柄(起点),直至运行开始部分。现在,指示器将同时显示整个运行情况。效果类似于尽可能缩小视图。请注意,如果选择完整运行时间,水平滚动条将不起作用。您已经看到了所有数据,无法再进行滚动。


现在,让我们放大显示特定区域。将视图滑块的起点拖至约 40 秒处,此时将启动 PTHREAD_MUTEX_DEMO,如输出窗口中所示。在拖动控柄时,指示器将放大显示 0:40 到结束的区域。请注意,可以重新使用滚动条在运行时间中前后滚动。

将鼠标光标放在橙色详细信息滑块端点上,以显示如何使用滑块的说明。通过使用详细信息滑块控件,可以选择某个运行时间部分以查看详细信息。
将详细信息滑块的起点控柄拖至约 40 秒处,请注意,指示器在起点前面的区域呈灰显。这样,便可突出显示起点和终点之间的图形。



在单击指示器的任何详细信息按钮(“热点”、“内存泄漏”或“同步问题”)时,将在详细信息标签中显示突出显示区域的数据。因此,这些控件可用于过滤数据。
将起点拖回到开始部分,以便查看所有数据。

浏览 CPU 使用情况

“CPU 使用情况”图显示了应用程序在运行期间使用 CPU 的总时间所占的百分比。

单击“CPU 使用情况”中的“热点”按钮以显示有关 CPU 时间的详细信息。

随即会打开“每个函数的 CPU 时间”标签,以显示程序的函数以及每个函数使用的 CPU 时间。这些函数按照使用的 CPU 时间顺序列出,使用时间最多的函数将列在最前面。如果程序仍在运行,最初显示的时间是单击图形时消耗的时间。




单击“函数名”列标题以按字母顺序对函数进行排序。
单击“CPU 时间(排除)”以按各个函数使用的时间顺序对函数进行排序。
请注意两列 CPU 时间之间的不同之处。“CPU 时间(包含)”显示从进入函数到退出函数所花费的总 CPU 时间,其中包括列出的函数调用的所有其他函数花费的时间。“CPU 时间(排除)”只显示特定函数使用的时间,不包括该函数调用的任何函数所花费的时间。

单击“CPU 时间(包含)”列标签以将最耗时的函数置于最顶端。请注意,
work_run_usrcpu
函数的 CPU 时间为 5.994(排除)和 6.034(包含),这意味着该函数调用的其他函数实际只使用了很少的 CPU 时间,而
work_run_usrcpu
函数本身使用了大部分时间。
其中一些函数以粗体显示。可以转至调用这些函数的源文件。双击
work_run_usrcpu
函数。




将会打开
common.c
文件,并且光标停留在第 59 行的
work_run_usrcpu
函数上。该行的左旁注中显示一些数字。

将鼠标光标悬停左旁注中的数字上。对于在“每个函数的 CPU 时间”标签中显示的函数排除和包含 CPU 时间,这些数字的度量是相同的。这些度量进行了四舍五入以占用更少空间,但将鼠标移到这些数字上时将显示未进行四舍五入的值。在
common.c
源文件中,还会显示 CPU 消耗时间行(如在
work_run_usrcpu
函数中执行计算的
for
循环)的度量。
将时间过滤器开始时间更改为 0:40,方法是键入时间并按 Enter 键,或者使用箭头滚动到相应的秒数。图形指示器将发生变化,如同在数据过滤控件上移动控柄时一样。如果拖动控柄,将更新“每个函数的 CPU 时间”标签中的“时间过滤器”设置以保持一致。更重要的是,将更新为表中的函数显示的数据以反映过滤器设置,以便仅显示在该时间段内使用的 CPU 时间。





也可以进行过滤以仅显示满足特定度量的数据。右键单击
work_run_usrcpu
的“CPU 时间(排除)”量度(本例中为 5.994)。选择“仅显示符合以下条件的行”>“CPU 时间(排除)== 5.994”。将过滤掉所有其他行,而仅显示 CPU 排除时间等于 5.994 的行。

浏览内存使用情况

“内存使用情况”指示器显示了项目的堆内存在其运行时如何变化。可以使用该指示器来识别内存泄漏(程序中不再需要的内存释放失败的点)。内存泄漏会导致程序中的内存使用量增加。如果发生内存泄漏的程序长时间运行,则可能会最终导致可用内存用完。

在“运行监视器”中左右滑动滑块,以查看内存堆如何随时间增加或减少。项目运行期间出现四次使用峰值。前两次出现在串行演示期间,第三次出现在并行演示期间,最后一次出现在 Pthread 互斥演示期间。
单击“内存泄漏”按钮以显示“内存泄漏详细信息”窗口,其中显示有关哪些函数发生内存泄漏的详细信息。

出现的表中只会列出产生内存泄漏的函数。如果单击该按钮时正在运行程序,显示的泄漏位置是单击该按钮时存在的泄漏。随着时间的推移,可能会发生更多泄漏,因此,应单击“刷新”按钮。如果在运行结束时未检测到任何内存泄漏,则“内存泄漏详细信息”标签将指示未找到内存泄漏。

可以更改开始和结束时间以过滤数据,或使用“运行监视器”窗口中的橙色详细信息滑块,如同在本教程前面的“每个函数的 CPU 时间”窗口中执行的操作一样。
在此次运行中,性能分析演示程序显示与
work_run_getmem
函数关联的内存泄漏。
双击
work_run_getmem
函数,将打开
common.c
文件并且光标位于函数中发生内存泄漏的行。
源代码编辑器的左旁注中将显示内存泄漏度量。将鼠标移到度量上以显示详细信息,如同对 CPU 使用情况度量执行的操作一样。




右键单击表中的度量以过滤表中的数据。可以为所有性能分析工具过滤表中的这些数据。


浏览线程使用情况

“线程使用情况”指示器显示了程序正在使用的线程数量以及线程必须等待锁定以继续执行其任务的时间。此数据对于多线程应用程序非常有用,这些程序必须执行线程同步以避免花费过多的等待时间。
线程使用情况指示器显示项目运行期间运行的线程数。将时间滑块滑回到开始部分,并注意到线程数为 1 个,直到约 0:40 秒处增加到 3 个。
将视图滑块端点控柄移到约 0:40 秒处,以便在指示器中同时查看 0:00 到 0:40 秒的情况。




查看 CPU 使用情况和内存使用情况指示器的 0:00 到 0:40 秒时间段,可以看到单个线程正在执行某个使用 CPU 时间和内存的活动。此时间段对应于串行演示部分,主线程先在文件中写入数据,然后再执行一些计算。在程序等待用户按 Enter 键时,CPU 和内存使用率将会减少,线程数保持为 1 个。

向右滑动时间滑块,以便看到线程数增加到 3 的两个点。
约 40 秒处的线程数增加对应于项目运行的并行演示部分,此时主线程启动两个额外的线程以并行执行文件写入和计算任务。此部分在 50 秒标记后不久结束。请注意,此阶段的内存和 CPU 使用率比较高,但完成两个任务的时间要少得多。
请注意,在并行演示线程结束后,线程数恢复为 1 个,并且主线程等待用户按 Enter 键。
运行程序的 Pthread 互斥演示部分时,线程数将增加到 3 个。
请注意,在线程数增加到 3 个后不久,将出现以橙色表示的锁定等待。Pthread 互斥演示使用互斥锁防止多个线程重叠访问某些函数。这是导致线程等待获得锁定的原因所在。
单击“同步问题”按钮以显示有关项目中的线程锁定的详细信息。将打开“线程同步详细信息”标签,并列出必须等待获得互斥锁的函数。还会显示以下度量:函数等待时所花费的毫秒数以及函数必须等待获得锁定的次数。
如果在程序运行时单击“同步问题”按钮,则可能需要单击位于“函数”列左侧的刷新按钮,以使用最新线程锁定信息更新显示。
单击“等待时间”列以按等待所花费的时间顺序对函数进行排序。
单击“锁定等待”列以按函数中线程等待的次数对函数进行排序。
双击
mutex_threadfunc
函数,该函数具有最大锁定等待次数。将在编辑器中打开
mutex.c
源文件,并将光标放在调用
pthread_mutex_lock
函数的行上。该函数负责在读取或写入内存位置前锁定该位置,并且必须等到其他线程没有锁定该内存时为止。




“等待时间”和“锁定等待”度量显示在源文件的左侧列中。请将鼠标光标放在度量上以查看详细信息,它与“线程同步详细信息”标签中显示的内容是一致的。
右键单击度量,然后取消选择“显示 Profiler 度量”。在源代码编辑器中,将不再为任何 C/C++ 性能分析工具显示度量。
在 IDE 菜单栏中选择“视图”,然后选择“显示 Profiler 度量”以重新显示度量。



正如所看到的一样,可以同时使用 CPU 使用情况、内存使用情况和线程使用情况监视器以查看在运行程序时发生的情况。但是,如果您在运行项目时不希望看到任何指示器,则可以将其关闭。在项目属性中,选择“分析”类别,然后取消选择“在运行过程中显示性能分析指示器”选项。

管理性能分析配置

通过管理性能分析配置,可以选择要在运行项目时显示的性能分析工具。

让我们设置自己的性能分析配置,以便在运行 C/C++ 项目时仅显示 CPU 使用情况和内存使用情况工具。

选择“工具”>“Profiler 工具”以打开“Profiler 工具管理器”对话框。



从“Profiler 配置”列表中,选择“管理配置...”。
在“Profiler 配置管理器”对话框中选择“C/C++ SunStudio 标准”。
单击“复制”。
单击“重命名”并键入 SunStudio CPU/Mem,然后单击“确定”。



在“Profiler 配置管理器”对话框中单击“确定”。
在“Profiler 工具管理器”对话框中选择新的 SunStudio CPU/Mem 配置。
取消选择工具列表中的“线程使用情况”工具,然后单击“确定”。
要使用该配置,请右键单击项目节点,然后选择“属性”。
在“项目属性”对话框中,选择“分析”类别。
对于“性能分析配置”,选择 "SunSutdio CPU/Mem",然后单击“确定”。



运行项目,将在“运行监视器”窗口中显示 CPU 使用情况和内存使用情况工具。

另请参见

Solaris 操作系统上 C/C++ 项目的 I/O 性能分析中介绍了“I/O 使用情况”工具。

在 Solaris 操作系统上使用线程微状态工具中介绍了线程微状态工具。

小结

本教程演示了 C/C++ 性能分析工具的以下几点内容:

在具有 Sun Studio 软件的 Linux 平台和 Solaris 平台上,将通过所选的 Sun Studio 软件或 Solaris DTrace 实用程序自动收集性能分析信息。
“运行监视器”标签中将显示图形性能分析指示器
单击指示器中的按钮将导致显示有关程序函数的详细信息
单击详细信息标签中的函数可以打开包含该函数的源文件,并将光标置于调用该函数的行上
可以在项目属性的“配置文件”类别中进行性能分析设置
可以在项目属性中禁用性能分析
可以在“性能分析配置”中选择性能分析工具
如果您可以访问网络上运行 Linux 或 Solaris 操作系统的系统,则可以从 Windows 或 Mac 计算机中使用性能分析工具,方法是将 Linux 或 Solaris 系统设置为用于生成和运行项目的远程开发主机
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: