在 Rational Developer for Power 中使用 Performance Advisor 对 C/C++ 应用程序进行性能调优

在 IBM Rational Developer for Power Systems Software 8.5 中引入的 Performance Advisor 提供了一组丰富的工具,支持您从运行于 IBM Power Systems 上的 C/C++ 应用程序中获得更好的性能。在本教程中,Mike Kucera 将带您领略 Performance Advisor 的主要功能,并向您展示如何提高示例应用程序的性能。

Mike Kucera, 软件开发人员, IBM

作者的照片Mike Kucera 是 Performance Advisor 开发人员团队的一名成员,对用户界面的设计有着重大影响。他还是 Eclipse CDT 开源项目的一名提交者。



2013 年 4 月 01 日

Performance Advisor 概述

IBM® Rational® Developer for Power Systems Software™ V8.5 引入了一个名为 Performance Advisor 的新组件,这个新组件提供了一组丰富的特性,用于性能调优 IBM® AIX® 和 IBM® PowerLinux™ 上的 C 和 C++ 应用程序。

Performance Advisor 易于使用且非常强大。如果您对性能调优不熟悉,那么您将会发现 Performance Advisor 是一个入门的好方法,因为用户界面很简单,而且该工具提供了大量反馈和引导。如果您是经验丰富的性能调优人员,那么您将会发现一组丰富工具,可以用来高效隔离并修复性能问题。

Rational Developer for Power Systems Software(通常非正式地称为 RD Power 或 RDp)已经因其开发和调试工具而众所周知,而且 Performance Advisor 与这些工具能够很好地集成。您可以将 Performance Advisor 用作一个独立的工具,或者将其无缝集成到现有的代码、构建、测试和调试周期中。

本教程将带您领略一个 Performance Advisor 用户一天的生活。


了解性能调优

开始学习本教程之前,让我们先从本质上来看看 Performance Advisor 是如何工作的。

性能数据来自哪里

Performance Advisor 从数个资源中收集数据。原始的应用程序性能数据来自低级别的操作系统工具,并每隔一定时间抽样检查处理器和内存的状态。编译器生成的调试信息允许该数据与最初的源代码相匹配。XLC 编译器可以生成 XML 报告文件来提供在编译期间执行的最优化信息。最后,对应用程序的构建和运行时系统进行分析以确定是否存在一些潜在的环境问题。

所有该数据都是自动进行收集、关联和分析,并以一种可以快速访问和容易理解的方式向您展示。这就使得可以很容易就确定用于优化应用程序的最佳策略。

抽样检查指令指针

有关 AIX 性能数据的主要资源是 tprof 命令(在 Linux 上,相对等的工具是 OProfile)。

当应用程序正在运行时,tprof 大约每隔 10 毫秒就醒来,记录处理器指令指针状态的样例,这包含了当前执行指令的内存地址。每个样例都称为一个节拍。性能运行完成之后,编译器生成的调试信息用于将每个节拍映射到其相应的源代码行中。从这个关联的数据中,您可以看出哪部分程序最常执行。这些部分被称为热点,而且通常是开始寻找优化程序代码机会的最佳位置。

基于抽样的性能数据的误区

在描述应用程序的同时,很可能存在几个在目标系统上执行的进程。最常见的做法是将许多节拍属性化来完成进程。由于这个原因,最好是在相对 “安静” 的系统上运行。最理想的情况是拥有一台机器专用于性能测试。

由于原始数据是以抽样检查为基础,所以增加样例数量会提高收集数据的统计相关性。我们建议正在描述的应用程序至少运行 30 秒,运行时间越长越好。可以选择一个输入集来完成此操作,该输入集会导致应用程序在延长的时间里运行;或者是在一个循环中使用一个脚本来多次运行应用程序从而完成此操作。

您可以直接从 AIX 命令行中运行 tprof,但是要使用这种方法很难。它具有高度可配置性并且采取了许多命令行选项。它生成的原始数据文件非常大,要手动进行分析会相当耗时。Performance Advisor 使用 tprof 来收集原始性能数据,但是这以透明方式来完成。因此,作为终端用户,您永远不需要直接处理这些低级别的工具。

抽样检查调用堆栈

调用堆栈抽样数据也是从低级别的系统工具中收集。这种数据来自于 AIX 上的 procstack 命令和 Linux 上的 OProfile 命令。

应用程序的调用堆栈每隔一定时间就进行一次抽样检查。而且应用程序的所有当前执行功能都被记录。您可以通过使用一个图形查看器来探索引起和来自任何感兴趣函数的运行时调用路径。有了该信息,您就可以回答以下问题:“该函数是因为花费太长时间执行而热还是因为调用太过频繁而热?”

系统积分卡报告

应用程序的性能还取决于其构建的方式以及其运行的环境。通常,无需对应用程序的源代码进行更改,只对构建或运行时环境所做的简单更改就会对应用程序的性能产生很大的影响。

Performance Advisor 会分析构建主机和运行时主机,并根据若干个标准进行计分;包括硬件级别、OS 级别、编译器版本以及构建选项。生成调用 System Scorecard 的报告并提供如何提高系统配置来实现更好的应用性能的建议。如果您正在寻找一些容易实现的目标,那么这会是一个很好的开始。

编译器转换报告

XLC 编译器可以产生 XML 报告文件,描述编译期间执行的优化情况。这些报告并没有严格要求,但一旦生成之后,更多信息就可用于分析。其中一个最有趣的事情是,这些报告展示的是编译期间以内联方式调用函数的位置。


教程:使用 Performance Advisor 提高 C++ 应用程序的性能

您可以使用 Performance Advisor 跨多个运行 AIX 或 PowerLinux 的机器来分析并比较应用程序的性能,但是为了简单起见,我们只关注单个 AIX 机器上的性能调优。

一个名为 RayTracer 的样例应用程序在 下载 部分提供,因为我们在整篇文章中都使用了该应用程序。RayTracer 是生成映像文件的一个小型 C++ 应用程序。我们将使用 Performance Advisor 来增量式地提高该应用程序的性能,并将其性能比作一个基线,接下来我们将进行讨论。

您可以下载 RayTracer 样例程序并跟随演示来学习,但要记住,性能结果取决于运行应用程序的系统,因此您会从以下示例中得到不同的数字。

先决条件:

您需要访问带有 XLC 11.1 的 AIX 服务器,以及安装的 Rational Developer for Power Systems Software 服务器组件。

入门指南

  1. 切换到 Performance Advisor 视图来开始 (Window > Open Perspective > Other > Performance Advisor)。
图 1. Performance Advisor 视图
屏幕截图

您需要做的第一件事就是连接到构建和运行应用程序的远程机器。

  1. 查找 Remote Systems 视图,在 New Connection 下,右键单击 AIX 节点并选择 New Connection,随后遵循安装向导。
图 2. 创建一个新的连接
Remote Systems 标签视图

接下来,我们需要一个远程的 C++ 项目,用于编辑和构建应用程序。

  1. 将 RayTracer 源代码提取到远程机器上某个位置的文件夹中。
  2. 从主菜单中选择 New > Remote C/C++ Project。
图 3. 创建一个远程的 C/C++ 项目
从 ‘New’ 中选择 ‘Remote C/C++ Project’
  1. 遵循安装向导设置项目。(在 Rational Developer for Power Systems Software 中有一些不同的远程项目类型,但 Performance Advisor 支持所有的类型。)
图 4. 新的远程 C/C++ 项目安装向导
远程 C/C++ 项目安装向导第一页

构建应用程序

应用程序必需使用启用的调试信息来编译,从而收集行级别的性能数据。对于 XLC 和 GCC 编译器来说,通过传递 -g 选项来完成此操作。此外,如果您在使用 XLC,那么在构建期间需要 -qlistfmt=xml=all 选项来生成 XML 转换报告。

想了解有关 Performance Advisor 使用的编译器选项的详细概述,请参阅 文档。RayTracer 提供的生成文件使用 XLC 在 AIX 平台上的正确选项。

创建一个启动配置

我们希望可以从 IDE 中启动 RayTracer 应用程序。

  1. 从主菜单中选择 Run > Run Configurations
图 5. Run Configurations 对话框窗口
创建一个 Remote Compiled Application 启动
  1. 在对话框窗口中,双击 Remote Compiled Application,然后再浏览 RayTracer 可执行文件的位置。

提示:
如果您单击 Run 按钮,那么将会看到 RayTracer 在远程机器上启动,而且在 Console View 中显示本地的控制台输出。

创建一个性能调优会话

现在遇到了最有趣的部分:性能调优应用程序。

Performance Advisor 中的主视图是 Performance Explorer 视图。您可以由此处启动性能运行、组织数据并分析结果。

性能运行通过使用两个工件来进行组织:SessionActivity。每个 Activity 表示应用程序的一个单一的性能运行,而 Session 只是一系列 Activity。有两种类型的 Activity:System ScorecardHotspot Detection。这两种类型在接下来的步骤中都将涉及到。

  1. 要创建一个 Session,单击 Performance Explorer 视图上方的 New Session 工具栏按钮,打开 New Performance Tuning Session 安装向导。
图 6. New Session 工具栏按钮
单击 New Session 工具栏按钮
图 7. New Performance Tuning Session 安装向导,第 1 页
创建一个 Performance Tuning Session

您可以使用 New Performance Tuning Session 安装向导来配置复杂的场景,比如跨多个机器调优大型的应用程序。然而,对于本教程而言,我将设置一个简单的场景,用于在单个机器上构建和调优小型的 RayTracer 应用程序。

安装向导的第一页要求以下信息:

  • 会话名称
  • 构建主机:Rational Developer for Power Systems Software 8.5 引入了一个新特性,允许远程项目跨多个主机保持同步。对于使用这种特性的项目,您此时应该选择构建主机。本教程只使用一个主机,因此默认情况下是正确的。
  • 运行时主机:Performance Advisor 支持这样一个场景,其中您可以在一个主机上进行构建,但是可在不同的主机上执行性能运行。这是专为具有性能测试机器的组织设计的,或者是您只想在不同的机器上测试应用程序(而不是进行构建),而您并不想复制此处所有的项目文件。在本教程中,使运行时主机与构建主机的状态相同。
  • 临时数据目录:性能数据收集期间,会创建一些临时的文件。您需要在运行(它们在运行后会被自动删除)期间提供一个文件夹来存储这些文件。单击 Use Default 按钮并在主目录下选择一个默认的位置。
  1. 提供信息之后,单击 Next
图 8. New Performance Tuning Session 安装向导,第 2 页
定义应用程序

在安装向导的第 2 页,需要提供组成应用程序的多个可执行且可共享库的位置。此信息用于提供更准确的建议(该数据也可以在创建会话后进行更新)。

  1. 浏览 RayTracer 可执行文件的位置,并将其添加到可执行的列表中。
  2. 单击 Next
图 9. New Performance Tuning Session 安装向导,第 3 页
创建 System Scorecard Activity

第 3 页将提示您创建一个 System Scorecard Activity,同时还有新的 Session。如果您是第一次性能调优一个特定的远程机器,那么这会是一个不错的想法。在此页上,您可以指定一个最小且首选的 Power 平台版本。如果您这么做了,那么随后生成的建议将关注您最担心的平台。

  1. 对于简单的示例,只需留下默认设置并单击 Finish

新的 Session 和 Activity 在 Performance Explorer 视图中显示。

图 10. 具有新 Session 和 Activity 的 Performance Explorer
Performance Explorer 现在显示新的 Session

运行 System Scorecard

System Scorecard Activity 在 new 状态下启动,这意味着它已经做好了运行的准备。Performance Explorer 的底部面板用于运行 Activities。

  1. 选择 System Scorecard Activity 并单击 Begin Data Collection 按钮。
图 11. 运行 System Scorecard Activity
从新的变成运行的活动

Activity 进入 running 状态。在后面,Performance Advisor 在分析运行时主机和可执行文件。当此过程完成后,Activity 进入 complete 状态。完成时间现在看上起与 Activity 差不多。

  1. 双击 Activity,打开 Scorecard Viewer。
图 12. System Scorecard 查看器
System Scorecard 显示 2 个建议的链接

在这里(图 12),我们可以看到实际上已经丢失了一些关键的最佳实践。结果是没有打开编译器优化,RayTracer 就先进行构建。

  1. 让我们来看看能做些什么,单击链接显示 2 个建议来打开 Recommendations 视图。

Recommendations 视图自动显示生成的建议,用于当前选定的 Activity。每个建议表示一个 Confidence Level,会议级别越高,下列建议就越有可能对性能产生积极影响。

图 13. Recommendation 视图
建议:提高优化级别并审查警告

Performance Advisor 已经确定应用程序应当使用 -O 编译器选项重新构建。要获得更好的性能,这种方法很快也很简单。

提高优化级别还很有可能会延长完成构建所用的时间。Performance Advisor 将有选择地推荐优化级别来显著增加应用程序的最热部分。那样的话,在优化应用程序最热部分的同时也避免了要花时间优化对整个性能影响较少的部分,从而可以获得最大利益。

确定一个基线

Performance Advisor 已经推荐我们重建具有更高编译器优化级别的 RayTracer。但在重建之前,最好是确定一个基线以便进行比较。也就是说对应用程序执行一个性能运行,然后再进行任何更改。

  1. 右键单击 Session,选择 New Activity
  2. 创建一个新的 Hotspot Detection Activity,将其命名为 Hotspot Detection 1,并使用您之前创建的启动配置。
图 14. New Activity 窗口
选择 Hotspot Detection 作为 Activity 类型

新的 Activity 将出现在 Performance Explorer 视图中。

图 15. 带有 Hotspot 检测的 Performance Explorer
Performance 现在包含新的会话
  1. 选择新的 Activity,单击按钮 Launch Program 和 Collect Data
  2. Activity 完成后,右键单击并选择 Set as Baseline
图 16. 设置基线
将 Hotspot Detection 1 设置为基线
图 17. 基线 Activity
Hotspot Detection 1 现在是基线

比较性能运行

  1. 打开生成文件,把 -O2 添加到编译器选项,并重建应用程序。
图 18. 生成文件编辑器
使用生成文件编辑器添加 -O2

现在让我们来看看这对应用程序的性能有什么影响。

  1. 创建另一个 Hotspot Detection Activity,将其命名为 Hotspot Detection 2,并运行。
  2. 操作完成后,右键单击,并选择 Compare with Baseline

图 19 显示的 Hotspots Comparison 浏览器将打开。

图 19. Hotspots Comparison 浏览器
MyApplication 显示比 2.034x 更快

这个查看器对两个性能运行的结果进行比较。在查看器的上方,它显示应用程序大约是正常速度的 2 倍。对于这么小的一项更改来说,这样的结果很大!


分析性能数据

现在,让我们试着对应用程序本身进行更改。但在开始之前,我们需要查看一下性能数据并确定我们需要进行哪些更改。

Hotspots 浏览器

双击 Hotspot Detection 2 Activity,打开 Hotspots Browser

图 20. Hotspots 浏览器
sqrt 是表中最热的函数

Hotspots Browser 的左侧窗格显示 Process Hierarchy Tree。该树显示了性能运行期间进行抽样检查的所有进程和线程。

过滤并查找函数

Hotspot Browser 有两个特性,这使得很容易就能找到所要查找的内容:

  • 您可以对进程树创建过滤器。实际上,My Application 和 Other Processes 节点都只是预定义的过滤器。您创建的任何自定义的过滤器都列在 My Filters 节点之下。要创建自己的过滤器,只需右键单击 My Filters 节点,并选择 New Filter 即可。
  • 此外,如果您正在寻找一个特定名称的函数,可以通过将部分函数名称键入到表上的过滤框中,从而过滤函数表。支持通配符 *,在处理复杂的 C++ 函数名称时非常有用。

与正在描述的应用程序相对应的进程在 My Application 节点下被隔离。同时所有其他运行在系统上的进程作为应用程序出现在 Other Processes 节点之下。

您可以扩展 My Application 节点来进行深度探讨,并检查组成应用程序的进程、线程和模块。RayTracer 属于单线程,所以在本例中只显示一个线程。对于多线程的或多进程的应用程序,可以单独或者作为一个组来检查每个线程或进程。

您可以在 Process Hierarchy Tree 选择一个节点来看看在该层次级别抽样检查的函数。在默认情况下,按照每个函数在配置文件中所花的时间量来对函数进行排序。最热的函数位于列表的首位,并且成为性能调优的一个很好起点。

通过查看该数据,我们可以看出 sqrt 函数占据了很大比例的应用程序执行时间。但是 sqrt 是一个库函数,因此我们不能直接对其进行修改。此外,优化库代码不是我们的工作范围。所以,让我们试着查明应用程序是如何使用 sqrt 的。

调用浏览器

  1. 右键单击函数热点表内的 sqrt 条目,选择 Show callers/callees,这将会打开 Invocations Browser。
图 21. 调用浏览器
使 sqrt 处于中心位置的调用图形

Invocations Browser 每次专注于一个函数,而且显示了所有抽样检查的调用堆栈(包括该函数)的图形表示法。

Invocations Browser 非常灵活。您可以对其进行放大和缩小、隔离特定的调用路径,并关注应用程序的不同部分。在这里,我们可以看到,调用 sqrt 的最热函数是这样的:

MyShape::sphere_find_intersection让我们看看该函数的代码。

  1. 右键单击 sphere_find_intersection 节点,选择 Open Source
图 22. Open Source 选项
在上下文菜单中选择的开源代码

Performance Source Viewer

Performance Source Viewer 在源代码上打开是为了以下函数:
sphere_find_intersection

查看器显示源代码,同时还有行级别的性能数据(参见图 23)。在代码的左侧,您可以看到每个单独的代码行在整个配置文件中所花的执行时间。

图 23. 性能源代码查看器
Sphere.cpp 在查看器中打开

Performance Source Viewer 旁边是标准的 Outline View。当 Performance Source Viewer 呈打开状态时,Outline View 显示文件中每个函数内代码块崩溃。您可以使用这个来找到代码的热块,比如热回路。

图 24. 标准的 Eclipse 概要视图
概要视图中的 sphere_find_intersection
  1. 返回到 Performance Source Viewer,单击第一个工具栏按钮,并跳转到文件中的代码最热行。

不必惊奇的是,最热的行包含 sqrt 函数的一个调用。

图 25. 转到最热的行
转到最热行的工具栏按钮

看起来好像有机会进行简单的优化。sqrt 函数返回的值并不用在下列 if 语句的第一部分。更改代码以便 sqrt 只在 else 部分中调用,这可能会对性能产生积极的影响,所以让我们来试试此项更改。

代码无法直接在 Performance Source Viewer 中编辑,因为行级别的性能数据在更改后不会正确排列。

  1. 单击 Switch to Editor 工具栏按钮。
图 26. 远程的 C/C++ 编辑器
编辑代码并将其优化
  1. 更改代码以便 sqrt 只在 else 部分中调用,然后重建应用程序。

比较源代码更改

  1. 创建另一个 Hotspot Detection 活动,将其命名为 Hotspot Detection 3 并运行。
  2. 完成之后,右键单击并选择 Compare with Previous 将其与前面的 Activity 进行比较。
图 27. 选择与前一个进行比较
与前一个选择的菜单项比较

正如图 28 的屏幕截图所示,代码更改对性能产生了积极的影响:应用程序现在是前一个运行速度的 2.353 倍。

图 28. 比较浏览器
My Application 比 2.353x 更快

函数影响表显示,sqrt 对更改有重大的影响。但在 sqrt 上有三个函数影响更大。查看 Invocations Browser(图 29)之后,我们可以发现三个函数都由 sqrt 调用,所以降低 sqrt 的调用之后,我们还可以降低这些函数的调用。

图 29. 调用浏览器
sqrt 调用图形中的其他 3 个函数

现在,将 Hotspot Detection 3 与基线进行比较。

图 30. 比较浏览器
My Application 现在比 4.785x 更快

作为两项更改结合后的结果,应用程序快 4.785 倍。还不错!

自动的源跟踪

我们可以在更改前后更近一步来比较 sphere_find_intersection 行级别的性能。

  1. Hotspot Detection 2 中打开 sphere_find_intersection 上的 Performance Source 查看器。

看一下查看器,您可以发现原始代码来自于更改之前(还有原始性能数据)。

  1. 现在,在 Hotspot Detection 3 中打开同一文件上的查看器。
  2. 将两个查看器紧挨着彼此固定,同时查看二者。
图 31. 比较源代码
固定在一起的两个 Sphere.cpp 实例

此时,您可能会想,“但是我已经编辑了该文件。我怎么才能看到更改之前的代码?”

Performance Advisor 包含一个称为 Automatic Source Tracking 的特性。您每次执行性能运行时,项目中所有源文件的状态都保存为一个快照。如果返回来查看之前的性能数据,您就会发现那个时候代码的样子。这会使您能够查看两个性能运行之间行级别性能数据的详细比较。该特性完全透明且自动工作。它不会干扰您可能已经在使用的任何版本控制系统,比如 IBM® Rational Team Concert™。

函数内联

  1. 让我们返回一点点再看一下 Hotspot Detection 1 和 Hotspot Detection 2 之间的比较。
图 32. 比较浏览器
再次比较前两个活动

好几个热门函数没有加速信息。事实上,他们显示 “未在 Activity Hotspot Detection 2 中检测到”。此处发生了什么事?

两个运行之间的惟一区别是我们在第二个运行中打开了编译器优化。编译器执行的其中一个最主要的优化是函数内联。

  1. 在 Hotspot Detection 1 中打开 RayTrace.cpp 文件上的 Performance Source 查看器。

查看器没有显示非常有趣的信息。有一些行级别的数据,但实际展示给我们的是在这个文件中不存在热门的代码行。

图 33. 来自 Hotspot Detection 的 RayTrace.cpp
不带任何有趣信息的 RayTrace.cpp
  1. 现在,在 Hotspot Detection 2 中打开同一个文件。
图 34. 来自 Hotspot Detection 2 的 RayTrace.cpp
带有内联信息的 RayTrace.cpp

在第二次运行时,查看器上有更多的信息。查看器左侧的小箭头图标表示包含函数调用的代码行,这些调用由编译器内联。

  1. 将鼠标指针悬浮在箭头上来获得一个弹出窗口,该窗口显示内联的函数。

单击箭头图标将扩大源代码以展示内联函数的源代码,这些内联函数直接与代码的其余部分内联。

图 35. 探讨函数内联
扩展 MyPoint 内联

第二次运行中,未能在 Function Comparison 浏览器中检测到多个热门函数的原因是编译器将这些函数完全内联到其调用站点。这对应用程序的性能有着积极的影响。该影响的结果可能以更高级别的细节进行探讨,其方法是使用 Performance Source 查看器对函数内联的支持。


结束语

Performance Advisor 提供了一组丰富的工具,用来在 AIX 和 PowerLinux 上性能调优 C/C++ 应用程序。本教程快速概述了最基本的特性。

这儿有一个列表,包括未在本文中涉及到的一些更高级特性:

  • Recommendation 视图始终可用。为每个 Activity 生成 Recommendation,而且是引导下次何处查看性能机会的极好方式。
  • 支持复杂的调优场景。您可以跨多个 AIX 和 PowerLinux 服务器构建和性能测试应用程序,然后再比较结果。
  • 您不需要坐在电脑前运行一个性能测试。Performance Advisor 允许您在离线时安排性能运行。例如,您可以安排一个一整夜的性能运行并在第二天分析数据。
  • Performance Advisor 带有一组 shell 脚本,可用于在没有安装 Rational Developer for Power Systems Software 的多个服务器上执行性能运行,或者是在不具备直接访问权限的服务器上。仅向客户端提供运行的脚本,然后导入结果数据进行分析。
  • 性能数据可通过使用导入和导出功能在团队成员之间进行共享。

下载

描述名字大小
样例应用程序RayTracer.zip137KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational, AIX and UNIX
ArticleID=863494
ArticleTitle=在 Rational Developer for Power 中使用 Performance Advisor 对 C/C++ 应用程序进行性能调优
publish-date=04012013