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

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

opreport -g -l -d 

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

因此,我所看到的许多问题都与以下方面有关:

  • 指针,多维数组
  • 乘法
  • 循环

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

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

谢谢

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

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

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

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

这在处理重载运算符时尤其重要 – 取决于库,这些可以是大时间接收器,并且在代码中看起来什么也没有。

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

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

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

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

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

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

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

for(int i = 0; i <100; i ++)for(int j = 0; j <1000; j ++)arr [i] [j]

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

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

如果您认为只有小优化是可能的,并且它确实取决于编译器, 您可能会发现这令人惊讶 。

这是我使用的方法,并解释了它的工作原理。