我们通常如何设置编译器的优化设置?
我们通常将编译器设置为针对最大速度或者最小代码大小进行优化吗?还是我们手动配置单个优化设置?为什么?
我注意到大多数时候人们倾向于只将编译器优化设置保持为默认状态,这对于Visual C ++而言意味着最高速度。
我一直觉得默认设置与在基准测试中看起来不错有关,基准测试往往是小型程序,它们完全适合L2缓存,而不是整体性能最佳的程序,因此我通常将其优化为最小大小。
解决方案
回答
我们总是使用最大化来获得最佳速度,但随后,我用C ++编写的所有代码都以某种方式与生物信息学算法相关,并且在代码大小相对较小的情况下,速度至关重要。
回答
如今,内存很便宜:)因此,除非我们使用嵌入式系统,否则将编译器设置设置为最大速度可能是有意义的。当然答案取决于具体情况。
回答
对我来说,这取决于我使用的平台。对于某些嵌入式平台或者当我在Cell处理器上工作时,我们会遇到一些限制,例如非常小的缓存或者为代码提供的最小空间。
我使用GCC并倾向于将其保留在" -O2"上,这是"最安全"的优化级别,并且倾向于在最小尺寸上提高速度。
我要说的是,除非我们正在为一个非常高性能的应用程序进行开发,否则这可能不会有很大的不同,在这种情况下,我们应该针对特定用例对各种选项进行基准测试。
回答
作为Gentoo的用户,我已经在完整的操作系统上尝试了很多优化,并且在Gentoo论坛上对此进行了无休止的讨论。可以在Wiki中找到一些关于GCC的好的标记。
简而言之,对大小进行优化在内存有限的老式Pentium3笔记本电脑上效果最好,但是在我的带有Core2Duo的主台式机上,-O2总体上效果更好。
如果我们对最优化的x86(32位)特定标志感兴趣,还有一个小脚本。
如果我们使用gcc并且确实要优化特定的应用程序,请尝试ACOVEA。它运行一组基准,然后使用所有可能的编译标志组合重新编译它们。有一个在网站上使用霍夫曼编码的示例(越低越好):
A relative graph of fitnesses: Acovea Best-of-the-Best: ************************************** (2.55366) Acovea Common Options: ******************************************* (2.86788) -O1: ********************************************** (3.0752) -O2: *********************************************** (3.12343) -O3: *********************************************** (3.1277) -O3 -ffast-math: ************************************************** (3.31539) -Os: ************************************************* (3.30573)
(请注意,它发现-Os在该Opteron系统上是最慢的。)
回答
我更喜欢使用最小的尺寸。内存可能很便宜,而缓存却不是。
回答
Microsoft交付了针对大小进行了优化的所有C / C ++软件。进行基准测试后,他们发现它实际上可以提供更好的速度(由于缓存的局部性)。
回答
除了缓存局部性很重要(正如On Freund所说)外,微软所做的另一件事是分析其应用程序并找出在启动的最初几秒钟内执行了哪些代码路径。之后,他们将这些数据反馈给编译器,并要求其将启动期间执行的部分放在一起。这样可以缩短启动时间。
我确实相信该技术可以在VS中公开使用,但我不确定100%。
回答
优化有多种类型,最大速度与较小代码的比较只是其中之一。在这种情况下,我将选择最大速度,因为可执行文件会稍大一些。
另一方面,我们可以针对特定类型的处理器优化应用程序。在某些情况下,这是一个好主意(如果我们打算仅在工作站上运行该程序),但是在这种情况下,该程序可能无法在其他体系结构上运行(例如:我们将程序编译为在奔腾上运行) 4机->在奔腾3上可能不起作用。
回答
两者都进行构建,进行概要分析,然后选择在特定项目和硬件上更有效的方法。
对于性能至关重要的代码,可以选择其他任何代码,并且不必理会。
回答
这取决于程序的应用程序。在对应用程序进行编程以控制快速工业过程时,优化速度将是有意义的。在对只需要对用户输入作出反应的应用程序进行编程时,对大小进行优化可能是有意义的。也就是说,如果我们担心可执行文件的大小。
回答
像这样调整编译器设置是一种优化。本着"过早的优化是万恶之源"的原则,直到程序接近其最终出货状态并且发现它不够快时,我才开始理会它。几乎从不。