GCC的已知C / C ++优化是什么?

时间:2009-09-03 12:17:31

标签: c++ c optimization gcc

我需要优化许多代码并使其运行得更快。我使用 opreport 告诉我代码花费了大量时间。我使用以下命令来获取统计信息

opreport -g -l -d

使用不同的标志可以获得更好的统计数据的建议,也许可以按行号而不是功能号找到它。

所以我认为“我认为”的很多问题都与:

有关
  • 指针,多维数组
  • 乘法

我希望编译器能够更好地优化代码,从而帮助他。我将一些代码块分解为带有字限制的函数,告诉编译器我的指针数组不重叠。

所以我正在寻找(a)可以使代码运行更长时间的常见C结构,以及(b)如何帮助编译器优化代码。

由于

7 个答案:

答案 0 :(得分:6)

小心分析工具的报告,它们可能会产生误导。例如,考虑一个执行大量字符串比较的应用程序,而不是其他。报告会告诉您,您将90%的时间花在字符串比较函数上。很自然地,你决定实现该代码的优化版本,只发现分析器告诉你,你仍然仍然花费90%的时间在那里(因为这是你的所有程序...... )。

您必须熟悉您的应用程序并将其应用于分析器,否则您可能会浪费精力。

今天的编译器在优化方面做得相当不错(特别是使用额外的标志作为选项)。您不太可能从语言级别的任何事情中受益(例如,您如何处理数组) - 如果您想要调整事物,您可能必须读取/写入asm。

答案 1 :(得分:4)

我在C ++中知道的最重要的事情是要小心你调用的方法。在C ++(以及任何OO语言)中,隐藏在非常小的接口背后的大量处理是非常简单的。

在处理重载运算符时,这一点尤为重要 - 取决于库,这些可能是大时间接收器,在代码中看起来什么都没有。

答案 2 :(得分:4)

这是一个有争议的论点 - 如果有'常见的C构造可以使代码运行更长'(并且我确信你认为有这样的构造是正确的)那么我希望有一个很好的优化编译器,好吧,为他们优化。你没有透露你正在使用哪个编译器,而且我不是C / C ++程序员,所以我很难建议任何特定的编译器标志或技巧来尝试。

我提供的唯一具体建议是:非常仔细地研究分析工具的输出,并且只花时间优化程序中那些值得付出努力的部分。

答案 3 :(得分:2)

总的来说:根据我的经验,90%的时间修复愚蠢的错误(比如无意中复制而不是传递引用)以及调整算法和数据结构是产生重大差异的原因。只有完全完成90%的优化后才考虑低级优化。

在您的情况下:如果opreport(我不知道,BTW)告诉您应用程序在哪里花费时间,则必须优化这些位。如果您需要帮助,可能需要发布一些具体的例子。

答案 4 :(得分:1)

嗯,优化有两种/方法 首先,可以优化架构。你知道,二元搜索而不是泡泡等等:)但是说真的,我希望这一点很清楚 第二,技术:一个使用任何形式的分析器,并寻找瓶颈。然后,当发现瓶颈时,仅对它们进行优化。

众所周知,过早优化是邪恶的根源,所以不要关心像类型/循环/虚拟或非等等的小调整。大部分时间并不是那么重要,而需要花费很多时间。恕我直言,这里的心理影响远远高于真实的影响 此外,您可以与游戏开发人员交谈:他们在这方面非常专业,我想他们会重复我的话:只优化优化所需的内容,然后优化有问题块的架构。
附: CPU也是不同的,你的优化可能只是浪费时间的一些......

答案 5 :(得分:0)

C ++中的内存分配可能很慢。确保正确地循环遍历数组以实现缓存一致性。如果你有int arr [100] [1000]那么你想循环像

for(int i = 0; i&lt; 100; i ++)     for(int j = 0; j <1000; j ++)       ARR [i] [j]

如果你在j之后循环我,那么你的CPU缓存没有被正确使用。如果您正在进行大量乘法,请尝试引入临时值以最小化您执行的乘法次数。编译器应该执行常见的子表达式消除,但有时它有助于明确地执行它。

答案 6 :(得分:0)

根据我的经验,它与您使用的语言或编译器没什么关系,它与代码的设计和组织方式有关。

如果您认为只有小优化是可能的,而且它真的取决于编译器,you might find this surprising

This is the method I use, and an explanation of why it works.