你通常会将编译器设置为最快的速度还是最小的代码大小?或者您是否手动配置单个优化设置?为什么?
我注意到大多数时候人们倾向于将编译器优化设置保留为默认状态,这在visual c++中意味着最大速度。我一直认为,默认设置更多地是为了在基准测试中看起来更好,基准测试往往是完全适合L2缓存的小程序,而不是对整体性能最好的程序,所以我通常会将其设置为最小大小。
发布于 2008-09-10 11:52:50
作为Gentoo的用户,我在完整的操作系统上尝试了相当多的优化,在Gentoo forums上也有关于它的无休止的讨论。在wiki中可以找到一些对GCC来说很好的标志。
简而言之,优化大小在内存有限的旧Pentium3笔记本上效果最好,但在我的装有Core2Duo的主要台式机上,-O2总体上提供了更好的结果。
如果您对最优化的x86 (32位)特定标志感兴趣,还有一个small script。
如果您使用的是gcc,并且确实想优化某个特定的应用程序,那么可以尝试使用ACOVEA。它运行一组基准测试,然后使用所有可能的编译标志组合重新编译它们。网站上有一个使用Huffman编码的例子(越低越好):
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系统中最慢的。)
发布于 2008-09-10 14:23:58
除了缓存位置很重要(如Freund所说),微软做的另一件事是分析他们的应用程序,并找出在启动的前几秒钟执行了哪些代码路径。之后,它们将这些数据反馈给编译器,并要求它将在启动期间执行的部分紧密地放在一起。这会导致更快的启动时间。
我确实相信这项技术在VS中是公开可用的,但我不能百分之百确定。
发布于 2008-09-10 11:49:52
对我来说,这取决于我使用的是什么平台。对于一些嵌入式平台,或者当我在Cell处理器上工作时,您会遇到一些限制,比如非常小的缓存或为代码提供的最小空间。
我使用的是GCC,我倾向于把它留在"-O2“上,这是最”安全“的优化级别,它支持最小规模的速度。
我想说,这可能不会有太大的不同,除非您正在为一个非常高性能的应用程序进行开发,在这种情况下,您可能应该针对您的特定用例对各种选项进行基准测试。
https://stackoverflow.com/questions/53811
复制相似问题