我正在发布一个C ++程序,其中包含Unix版本的makefile,我想知道我应该使用什么编译器选项来获得最快的代码(它属于可以使用所有计算能力的程序类别因为我不知道硬件, *** 作系统或gcc版本的用户将有什么,我想要高于一切,以确保它至less在每个主要的Unix类似的工作正常 *** 作系统。
到目前为止,我有g++ -O3 -Wno-write-strings ,还有其他的选项可以添加吗? 在windows上,微软编译器有快速调用约定和链接时间代码生成等值得使用的选项,gcc上是否有任何等价物?
(我假设它将在64位平台上默认为64位,如果不是这种情况,请纠正我)。
使崩溃日志有意义(c ++,linux env)
从客户端发送任何消息之前,无法将消息从服务器端打印到客户端
从Visual Studio Solution生成Make文件(用于GCC)
write()返回后立即从文件中读取()是否安全?
“循环设备”中的“循环”是什么意思?
OpenCV 3.1.0不能用CMake编译
如何用C#.NET编写程序,在linux / Wine / Mono上运行它们?
这些消息在NetBeans C ++ 8.0.2输出中的含义是什么?
Visual C ++中容错DLL的使用
windows 8应用程序WebVIEw捕获事件目标=“_ blank”
不知道你的程序的具体细节,很难说。 O3涵盖了大部分的优化。 其余的选择是“有代价的”。 如果你可以容忍一些随机舍入,你的代码不依赖于IEEE浮点标准,那么你可以尝试-Ofast。 这忽略了标准合规性,并可以给你更快的代码。
其余的优化标志只能提高某些程序的性能,但对其他程序甚至是不利的。 查看优化标志的gcc文档中的可用标志并对其进行基准测试。
另一个选项是启用C99(-std = c99)并内联适当的功能。 这是一个艺术,你不应该内联一切,但有一点工作,你可以让你的代码更快(虽然以一个更大的可执行文件为代价)。
如果速度真的是一个问题,我会建议要么回到微软的编译器,要么尝试英特尔的。 我已经开始意识到一些gcc编译的代码可以很慢,特别是当涉及到math.h时。
编辑:哦,等等,你说C ++? 然后无视我的C99段落,你可以内联:)
我会尝试简介指导优化:
-fprofile-generate启用通常用于检测应用程序的选项,以生成配置文件,以便随后使用基于配置文件反馈的优化进行重新编译。 在编译和链接程序时,必须使用-fprofile-generate 。 以下选项已启用: -fprofile-arcs , -fprofile-values , -fvpt 。
你也应该给编译器提示关于程序运行的体系结构。 例如,如果它只能在服务器上运行,并且可以在与服务器相同的机器上进行编译,则可以使用-march=native 。 否则,您需要确定您的用户将拥有哪些功能,并将相应的参数传递给GCC。
(显然你的目标是64位,所以GCC可能已经包含比通用x86更多的优化。)
考虑使用-fomit-frame-pointer除非你需要使用gdb(yuck)进行调试。 这将给编译器一个更多的寄存器来使用变量(否则这个寄存器浪费了无用的帧指针)。
你也可以使用类似-march=core2或者更一般的-march=native来使编译器能够使用更新的指令,并进一步调整指定架构的代码,但是为此你必须确保你的代码不会被期望运行在旧的处理器上。
-oFast
请尝试-oFast而不是-o3
此处还有一列您可能希望选择性启用的标志。
-ffloat店
-fexcess精度=风格
-ffast,数学
-fno-舍入数学
-fno-信令的NaN
-fcx-有限范围
-fno-数学错误号
-funsafe-数学优化
-fassociative,数学
-freciprocal,数学
-ffinite,数学只
-fno签署3/0
-fno截留数学
-frounding,数学
-fsingle精度恒定
-fcx Fortran的规则
这里提供了一个完整的标志列表及其详细描述
gcc -O3不保证是最快的。 -O2通常是一个更好的起点。 之后,配置文件指导优化和尝试具体的选项: http : //gcc.gnu.org/onlinedocs/gcc/Optimize-Options.HTML
这是一个很长的阅读,但可能值得。
请注意,“链接时间代码生成”(MSVC)(也称为“链接时间优化”)可在gcc 4.5+中使用
顺便说一下,Win64没有特定的“fastcall”调用约定。 只有“调用约定”: http : //msdn.microsoft.com/en-us/magazine/cc300794.aspx
除了其他人已经提出的建议之外,您应该尝试使用-flto 。 它使链接时间优化,在某些情况下,可以真正做到魔术。
有关更多信息,请参阅https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.HTML
在x86-64上没有“快速调用” – Win64和linux ABI都将基于寄存器的调用(“fastcall”)定义为唯一的调用约定(尽管linux使用更多的寄存器)。
总结以上是内存溢出为你收集整理的最快的代码的gcc选项全部内容,希望文章能够帮你解决最快的代码的gcc选项所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)