繁体   English   中英

bcc64优化-O1 vs -O2仍然比bcc32慢40%以上

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM