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