当我编写一个例程来测试两个东西的性能时,我应该使用哪些优化标志?-O0、-O2 或 -g ?
3 回答
您应该使用每个设置来测试代码的性能。理想情况下,数字 -O0、-O1、-O2、-O3 越大,意味着更好的性能,因为有更多/更好的优化,但情况并非总是如此。
同样,取决于您的代码是如何编写的,其中一些可能会以您不期望从语言或编译器或两者兼而有之的方式删除。因此,您不仅需要测试代码的性能,还需要实际测试从代码生成的程序,看看它是否按照您的想法执行。
绝对没有一种优化设置可以为可由该编译器编译的任何代码提供最佳性能。您必须在特定系统上测试设置和编译器,以验证该系统的代码确实运行得更快。您如何测试该性能充满了许多陷阱和其他产生错误的问题,您很容易误解结果。所以你必须小心你如何测试你的表现。
对于 gcc,人们通常说 -O3 使用起来有风险,而 -O2 是最好的性能/安全性。在大多数情况下,-O2 的使用足以清除许多错误。-O2 并不总是产生最快的代码,但它通常产生比 -O0 和 -O1 更快的代码。使用调试器可能会破坏优化或将其全部删除,因此切勿使用基于调试器的构建或使用调试器来测试性能。像用户使用系统一样在系统上进行测试,如果用户在运行您的程序时使用调试器,则以这种方式进行测试,否则不要。
在 GCC-O0
中完全禁用编译器代码优化。-g
将调试信息添加到可执行文件,以便您可以使用调试器。
如果要启用速度优化,请使用标志-O1
或-O2
. 有关man gcc(1)
更多信息,请参阅。
如果您想测量代码的性能,请使用分析器,例如 valgrind 或 gprof。
实际上,如果您关心性能,则绝对应该使用-O3
. 为什么要放弃潜在的优化?
-O2
是的,和之间存在微小但可测量的差异-O3
。
-g
不是优化标志,但它可以阻止优化,因此必须为代表性基准禁用它。