另外,有人能指点我这个主题的好教程吗?我找不到任何。
答案 0 :(得分:49)
-fprofile-generate将使用性能分析代码检测应用程序。应用程序将在实际运行时记录某些事件,如果在编译时已知这种使用模式,则可以提高性能。分支,内联的可能性等都可以记录,但我不确定GCC如何实现这一点。
程序退出后,它会将所有这些数据转储到* .gcda文件中,这些文件实际上是测试运行的日志数据。使用-fprofile-use标志重建应用程序后,GCC会在进行优化时考虑* .gcda日志数据,通常会显着提高性能。当然,这取决于很多因素。
答案 1 :(得分:19)
来自this example:
g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name
// run my program's benchmarks, or something to stress its most common path
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name
基本上,您最初编译并链接此额外标志以进行编译和链接:-fprofile-generate
(来自here)。
然后,当你运行它时,默认它会在.o文件的“下一步”创建.gcda文件,它似乎(硬编码到它们构建的完整路径)。
您可以选择使用-fprofile-dir = XXX setting更改创建这些.gcda文件的位置。
然后使用-fprofile-use
参数重新编译和重新链接,并使用配置文件引导的优点对其进行编译。
答案 2 :(得分:2)
棘手的一点是设置makefile。
对于目标文件,您肯定需要单独的输出目录。我建议命名为“profile”和“release”。您可能必须复制由配置文件运行产生的* .gcda文件,以便GCC在发布版本步骤中找到它们。
结果几乎肯定会更快。它可能也会更大。 -fprofile-use选项启用许多其他优化步骤,否则这些步骤仅由-O3启用。