Optimization 测试两个东西的性能,我应该使用哪些标志(与gcc一起使用)-O0、-O2或-g?

Optimization 测试两个东西的性能,我应该使用哪些标志(与gcc一起使用)-O0、-O2或-g?,optimization,gcc,Optimization,Gcc,当我编写一个例程来测试两个东西的性能时,我应该使用哪些优化标志-GCC中的O0、-O2或-g?-O0完全禁用编译器代码优化-g将调试信息添加到可执行文件中,以便您可以使用调试器 如果要启用速度优化,请使用标志-O1或-O2。有关更多信息,请参见man gcc(1) 如果您想测量代码的性能,请使用valgrind或gprof。实际上,如果您关心性能,则一定要使用-O3。为什么要放弃潜在的优化 是的,-O2和-O3之间有一个微小但可测量的差异 -g不是优化标志,但它会阻止优化,因此必须对代表性基准禁

当我编写一个例程来测试两个东西的性能时,我应该使用哪些优化标志-GCC中的O0、-O2或-g?

-O0完全禁用编译器代码优化
-g
将调试信息添加到可执行文件中,以便您可以使用调试器

如果要启用速度优化,请使用标志
-O1
-O2
。有关更多信息,请参见
man gcc(1)


如果您想测量代码的性能,请使用valgrind或gprof。实际上,如果您关心性能,则一定要使用
-O3
。为什么要放弃潜在的优化

是的,
-O2
-O3
之间有一个微小但可测量的差异


-g
不是优化标志,但它会阻止优化,因此必须对代表性基准禁用它。

您应该使用每个设置测试代码的性能。理想情况下,数值-O0、-O1、-O2、-O3越大意味着性能越好,因为优化越多/越好,但情况并非总是如此

同样,根据代码的编写方式,部分代码可能会以一种您从语言或编译器或两者中都没有预料到的方式被删除。因此,您不仅需要测试代码的性能,还需要实际测试从代码生成的程序,以查看它是否按照您认为的那样工作

没有一种优化设置可以为编译器编译的任何代码提供最佳性能。您必须在特定系统上测试设置和编译器,以验证该系统的代码确实运行得更快。如何测试该性能充满了许多陷阱和其他容易产生错误的问题,您很容易误解结果。因此,你必须小心如何测试你的表现


对于gcc来说,人们通常说-O3使用起来有风险,-O2是最好的性能/安全。在大多数情况下,氧气的使用量足以将许多细菌排出体外-O2并不总是生成最快的代码,但它通常会生成速度更快的代码-O0和-O1。使用调试器可能会挫败优化或将其全部删除,因此永远不要使用基于调试器的构建或使用调试器测试性能。按照用户使用系统的方式在系统上进行测试,如果用户在运行程序时使用了调试器,则以这种方式进行测试,否则不要这样做。

请仔细考虑。你认为人们可能需要知道什么是编译器或者你在说什么吗?;-)这种风格的标志对于一些喜欢发布软件的。@T.J.Crowder人来说很常见,所以我选择-O2。谢谢。@user:你似乎没有抓住重点,但至少你在问题的标题中添加了“with gcc”。(提示:这就是标签的用途)
O3
并不一定比我理解的gcc的
O2
好。O3具有攻击性内联,可能会损害局部性并降低性能。因此,最好同时检查这两个方面,看看哪些方面的性能更好。@Voo就像我说的,有基准测试。虽然在病理病例中,
-O3
可能比
-O2
慢,但它通常更快或至少与之一样快。特别是内联通常不会降低性能,因为优化程序不会“愚蠢地”内联,它仍然使用启发式方法来确定执行速度是否会从内联中受益。