![](/img/trans.png)
[英]-O2 in ICC messes up assembler, fine with -O1 in ICC and all optimizations in GCC / Clang
[英]bcc64 optimizations -O1 vs -O2 still slower than bcc32 by 40% and more
我有一个由VCL可执行文件和一个标准C ++ DLL组成的产品,这些产品都是使用C ++ Builder XE4构建的。 我以32位和64位版本发布。
在使用发布版本进行性能测试时,64位版本的运行速度要慢得多,慢40%。
我知道我需要启用优化才能使性能测试有意义。 XE4允许我进行设置(互斥):
-O1 =最小的可能代码-O2 =最快的可能代码
我已经使用了其中的每一个,但是结果没有改变。
我从这里的帖子中看到Linux / g ++程序员使用-O3(最小和最快?)(请参阅64位可执行文件的运行速度低于32位版本 )。 但是-O3不是我的环境的选择。
我应该查看其他编译器设置吗?
谢谢你的帮助。
64位模式的主要缺点是指针的大小加倍。 对齐规则也可能导致类/结构更大。 也许您的代码勉强适合32位模式下的缓存,但不适合64位模式。这特别是。 如果您的代码使用了大量的指针,则可能会出现这种情况。
另一种可能性是,您调用了一些外部库,并且其32位版本具有一些asm加速功能,但64位版本却没有。
使用探查器查看您的64位版本中实际运行缓慢的内容。 对于Windows,Intel的VTUNE也许是一个不错的选择。 您可以看到您的代码在哪里有很多缓存未命中。 比较32位和64位之间的总高速缓存未命中数应该会有所启发。
关于: -O1
与-O2
:不同的编译器对选项的含义不同。 gcc和clang具有:
-Os
:优化代码大小 -O0
:最小/不优化(每一步之后大多数内容都从RAM中存储/重新加载) -O1
:进行一些优化,而无需花费很多额外的编译时间 -O2
:更多优化 -O3
:更多优化,包括自动矢量化 Clang似乎没有记录其优化选项,因此我认为它与gcc相同。 (有一些选项可以报告其所做的优化 ,以及使用配置文件引导的优化。)有关优化选项的更多说明,请参见最新版本的gcc手册(在线) :例如
-Ofast
: -O3 -ffast-math
(甚至可能是“不安全的”优化。) -Og
:在不中断调试的情况下进行优化。 推荐用于编辑/编译/调试周期。 -funroll-loops
:可以帮助解决一些紧密的循环,但是即使在-O3
也没有启用。 不要使用所有内容,因为更大的代码大小可能会导致I缓存未命中,从而造成更大的损失。 -fprofile-use
确实启用了此功能,因此理想情况下只使用PGO。 -fblah-blah
:还有很多更具体的选择。 通常只使用-O3
选择推荐的设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.