简单度量分析

如果还没有为 synprog 收集性能数据,必须进行收集,并打开第一个实验 test.1.er。相关说明参见为 synprog 示例收集数据

在示例的此部分中,将检查两个函数 cputime()icputime() 的用户 CPU 时间。这两个函数都包含一个 for 循环,每循环一次,变量 x 的值增加一。在 cputime() 中,x 是浮点变量,但在 icputime() 中,x 是整型变量。

  1. 在 [函数] 标签中找到 cputime()icputime()

    可以使用查找工具来查找函数,而不必滚动显示内容。

    比较两个函数的互斥用户 CPU 时间。cputime() 所用的时间远远多于 icputime() 所用的时间。

  2. 选择 [文件] 然后选择 [创建新窗口] (Alt-F,N)。

    将显示包含相同数据的新分析器窗口。调整窗口的位置,以便可以看到两个窗口。

  3. 在第一个窗口的 [函数] 标签中,单击 cputime() 将其选中,然后单击 [源] 标签。
  4. 在第二个窗口的 [函数] 标签中,单击 icputime() 将其选中,然后单击 [源] 标签。

    带注释的源代码列表将告知您哪些代码行负责 CPU 时间。两个函数中的大部分时间都由循环行和递增 x 的行所使用。

    icputime() 中的循环行所用的时间与 cputime() 的循环行所用的时间大致相同,但 icputime() 中递增 x 的行的执行时间远远少于 cputime() 中的相应行。

  5. 在这两个窗口中,单击 [反汇编] 标签,找到递增 x 的源代码行的指令。

    在查找工具组合框中选择 [高度量值] 并进行搜索,也可以找到这些指令。

    cputime() 中,大量时间用于执行 fstodfdtos 指令。这些指令将 x 的值从单精度浮点值转换为双精度浮点值,然后又转换回单精度浮点值。必须完成此过程才能使 x 以双精度浮点数常量 1.0 递增。

    icputime() 中,因为无需进行转换,所有相关的加载、添加和存储操作所需时间约为 cputime() 中相应指令集执行时间的三分之一。值 1 不需要加载到注册表中,它可以通过单一指令直接添加到 x 中。

  6. 完成练习之后,请关闭新分析器窗口。

拓展练习

编辑 synprog 的源代码,将 cputime()x 的类型改为 double。在早先用于收集 synprog 的数据的终端窗口中,键入下列命令,以重新编译程序并记录新实验:

% make
% collect synprog

在性能分析器中打开新实验 test.3.er

更改 x 对时间有何影响?在带有注释的反汇编列表中看到哪些不同之处?

另请参见
函数标签
源标签
反汇编标签

找到要找的内容了吗?如未找到,请将您的意见通过电子邮件发送至 docfeedback@sun.com。
法律声明