如果还没有为 synprog 收集性能数据,必须进行收集,并打开第一个实验 test.1.er。相关说明参见为 synprog 示例收集数据。
在示例的此部分中,将检查两个函数 cputime() 和 icputime() 的用户 CPU 时间。这两个函数都包含一个 for 循环,每循环一次,变量 x 的值增加一。在 cputime() 中,x 是浮点变量,但在 icputime() 中,x 是整型变量。
可以使用查找工具来查找函数,而不必滚动显示内容。
比较两个函数的互斥用户 CPU 时间。cputime() 所用的时间远远多于 icputime() 所用的时间。
将显示包含相同数据的新分析器窗口。调整窗口的位置,以便可以看到两个窗口。
带注释的源代码列表将告知您哪些代码行负责 CPU 时间。两个函数中的大部分时间都由循环行和递增 x 的行所使用。
icputime() 中的循环行所用的时间与 cputime() 的循环行所用的时间大致相同,但 icputime() 中递增 x 的行的执行时间远远少于 cputime() 中的相应行。
在查找工具组合框中选择 [高度量值] 并进行搜索,也可以找到这些指令。
在 cputime() 中,大量时间用于执行 fstod 和 fdtos 指令。这些指令将 x 的值从单精度浮点值转换为双精度浮点值,然后又转换回单精度浮点值。必须完成此过程才能使 x 以双精度浮点数常量 1.0 递增。
在 icputime() 中,因为无需进行转换,所有相关的加载、添加和存储操作所需时间约为 cputime() 中相应指令集执行时间的三分之一。值 1 不需要加载到注册表中,它可以通过单一指令直接添加到 x 中。
编辑 synprog 的源代码,将 cputime() 中 x 的类型改为 double。在早先用于收集 synprog 的数据的终端窗口中,键入下列命令,以重新编译程序并记录新实验:
% make % collect synprog
在性能分析器中打开新实验 test.3.er。
更改 x 对时间有何影响?在带有注释的反汇编列表中看到哪些不同之处?
另请参见 | |
---|---|
函数标签 源标签 反汇编标签 |