使用该选项收集并保存执行频率数据,从而可在以后的运行中使用该数据来提高性能。只有将优化级别指定为 -xO2 或更高时,该选项才有效。
必须在编译和链接时指定 -xprofile。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A–2。
通过为编译器提供运行时性能反馈可以增强在较高优化级别(例如,-xO5)进行的编译。为了生成运行时的性能反馈,必须使用 -xprofile=collect 编译,然后针对典型数据集运行可执行文件,最后在最高的优化级别使用 -xprofile=use 重新编译。
另请参见 cc(1) 手册页,以了解额外的功能以及如何控制环境变量。
对多线程应用程序来讲,配置文件集合是安全的。也就是说,对执行自身多任务 (-mt) 的程序进行文件配置会产生准确的结果。
p 必须为 collect[: name]、use[:name] 或 tcov。
collect[:name]
优化器使用 -xprofile=use 收集并保存执行频率数据以备将来使用。编译器生成可测量语句执行频率的代码。
name 是执行程序时要在其中存储配置文件数据的目录的名称(可选)。如果指定 name,则它应为绝对 UNIX 路径名。如果未指定 name,则在执行 program 时,名为 program 的已进行文件配置的程序的配置文件数据将存储在当前工作目录中的 program.profile 目录中。
可以设置环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR,以控制用 -xprofile=collect 编译的程序存储配置文件数据的位置。如果设置了这两个环境变量,则 -xprofile=collect 数据将写入到 SUN_PROFDATA_DIR/SUN_PROFDATA。
这些环境变量同样控制 tcov 写入的配置文件数据文件的路径和名称,如 tcov(1) 手册页所述。
如果未设置这些环境变量,则配置文件数据将写入当前目录内的 name.profile/feedback 中,其中 name 是可执行文件的名称或在 -xprofile=collect: name 标志中指定的名称。如果 name 已经以 .profile 结尾,则 -xprofile 不会将 .profile 附加到 name 中。如果多次运行程序,那么执行频率数据会累积在 feedback 文件中;也就是说,以前执行的输出不会丢失。
如果在不同的步骤中进行编译和链接,应确保使用 -xprofile=collect 编译的任何目标文件也使用 -xprofile=collect 进行链接。
三个选项 -xMerge -ztext -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
use[:name]
使用在 feedback 文件中生成并保存在该文件中的执行频率数据来优化程序,该数据由先前执行使用 – xprofile=collect 编译的程序生成。
name 是所分析程序的名称。该名称是可选的。如果未指定 name,则假定 a.out 为可执行程序的名称。
除了从 -xprofile=collect 更改为 -xprofile=use 的 -xprofile 选项之外,源文件和其他编译器选项必须与用于(创建了之后生成 feedback 文件的编译程序的)编译的源文件和编译器选项完全相同。编译器的相同版本必须既用于收集生成也用于使用生成。如果使用 -xprofile=collect:name 进行编译,则相同的程序名称 name 必须出现在优化编译中:-xprofile=use:name。
目标文件与其配置文件数据之间的关联依据的是使用 -xprofile=collect 编译目标文件时该文件的 UNIX 路径名。在某些情况下,编译器不会将目标文件与其配置文件数据相关联:由于以前没有使用 -xprofile=collect 编译目标文件,因此目标文件没有配置文件数据;程序中的目标文件未使用 -xprofile=collect 进行链接;从未执行过该程序。
如果先前使用 -xprofile=collect 在不同目录中编译了目标文件,而该目标文件与使用 -xprofile=collect 编译的其他目标文件共享一个公共基名,但却无法通过它们的包含目录名称进行唯一标识,编译器也会产生混淆。在这种情况下,即使目标文件有配置文件数据,使用 -xprofile=use 重新编译目标文件时,编译器也不能在 feedback 目录中找到该目标文件。
所有这些情况都能使编译器丢失目标文件及其文件配置数据之间的关联。因此,在您指定 -xprofile=use 时,如果目标文件具有文件配置数据但编译器无法将其与目标文件的路径名相关联,那么请使用 -xprofile_pathmap 选项来标识正确的目录。请参见B.2.140 -xprofile_pathmap。
tcov
-xprofile=tcov 选项是 tcov 的基本块文件配置的新样式。其功能与 -xa 选项相似,此外还能正确地为在头文件中具有源代码的程序收集数据。请参见B.2.70 -xa,以了解有关旧样式文件配置的信息;请参见 tcov(1) 手册页和 Program Performance Analysis Tools,以了解详细信息。
执行代码检测与执行 -xa 选项相似,但是不再生成 .d 文件。相反却生成单一文件,并且该文件的名称是按照最后的可执行文件命名的。例如,如果程序在 /foo/bar/myprog.profile 外运行,则数据文件将存储在 /foo/bar/myprog.profile/myprog.tcovd 中。
-xprofile=tcov 和 -xa 选项在单个可执行程序中兼容。也就是说,您可以链接一个程序,该程序中包含的部分文件已用 -xprofile=tcov 编译,而其他文件是用 -xa 编译的。您不能同时用这两个选项来编译同一个文件。
运行 tcov 时,您必须将 -x 选项传递给它,以便它使用新式数据。否则,tcov 使用原来的 .d 文件(如果有;这是数据的缺省值),并产生不可预测的输出。
与 -xa 选项不同,TCOVDIR 环境变量在编译时无效。不过,在程序运行时可以使用环境变量的值。有关详细信息,请参见 tcov(1) 和 Program Performance Analysis Tools。
如果由于 -xO4 或 -xinline 存在例程的内联处理,则 tcov 的代码覆盖报告可能不可靠。
在 Linux 平台上,不应将 -xprofile=collect 或 -xprofile=tcov 与 -G 一起使用来生成共享库。
当您使用 -xprofile=collect 来编译用于配置文件收集的程序,而用 -xprofile=use 来编译用于配置文件反馈的程序时,在这两个编译中,除 -xprofile=collect 和 -xprofile=use 之外的源文件和编译器选项必须相同。
-xprofile=use: name 选项指定的配置文件反馈目录名称从该选项在一次编译器调用中的所有实例中累积。例如,假定分别执行名称为 a、b 和 c 的已进行文件配置的二进制文件结果是创建文件配置目录 a.profile、b.profile 和 c.profile。
cc -O -c foo.c -xprofile=use:a -xprofile=use:b -xprofile=use:c |
这三个配置文件目录均被使用。编译目标文件时,与特定目标文件有关的任何有效配置文件反馈数据都从指定的反馈目录中开始累积。
如果在同一的命令行上同时指定 -xprofile=collect和 -xprofile=use,则命令行中最右边 -xprofile 选项的应用如下所示:
如果最右边的 -xprofile 选项是 -xprofile=use,则 -xprofile=use 选项指定的所有配置文件反馈目录名都将用于定向反馈优化,同时忽略以前的 -xprofile=collect 选项。
如果最右边的 -xprofile 选项是 -xprofile=collect,则忽略 -xprofile=use 选项指定的所有配置文件反馈目录名,同时启用配置文件生成的检测。
另请参见: -xhwcprof、-xprofile_ircache、-xprofile_pathmap