bcc64优化-O1 vs -O2仍然比bcc32慢40%甚至更多

时间:2015-07-30 15:10:36

标签: c++ performance optimization

我有一个包含VCL可执行文件和标准C ++ DLL的产品,所有这些都是使用C ++ Builder XE4构建的。我发布的是32位和64位版本。

使用发布版本进行性能测试时,64位版本的运行速度要慢得多......慢40%。

我知道我需要启用优化才能使性能测试变得有意义。 XE4允许我设置(互相排斥):

-O1 =可能的最小代码 -O2 =最快的代码

我已经使用了这些中的每一个,但结果没有改变。

我在帖子中看到Linux / g ++程序员使用-O3(最小和最快?)(参见64-bit executable runs slower than 32-bit version)。但是-O3不适合我的环境。

我应该关注其他编译器设置吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

64位模式的主要缺点是指针大小加倍。对齐规则也可能导致类/结构更大。也许你的代码几乎不适合32位模式的缓存,但不适合64.这是特别的。很可能,如果你的代码使用了很多指针。

另一种可能性是你打电话给一些外部库,你的32位版本有一些asm加速,但64位版本没有。

使用分析器查看64位版本中的实际速度有多慢。对于Windows,英特尔的VTUNE可能是一个不错的选择。您可以看到代码中存在大量缓存未命中的位置。比较32位和64位之间的总缓存未命中率应该会有所启发。

Re:-O1-O2:不同的编译器对选项有不同的含义。 gcc和clang有:

  • -Os:针对代码大小进行优化
  • -O0:最小/无优化(大部分内容在每一步后都从RAM中存储/重新加载)
  • -O1:一些优化而不需要花费大量额外的编译时间
  • -O2:更多优化
  • -O3:更多优化,包括自动矢量化

Clang似乎没有记录它的优化选项,所以我认为它反映了gcc。 (有options to report on optimizations it did,并使用配置文件引导优化。)有关优化选项的更多说明,请参阅the latest version of the gcc manual (online):例如。

  • -Ofast-O3 -ffast-math(也许"不安全"优化。)
  • -Og:优化而不会破坏调试。推荐用于编辑/编译/调试周期。
  • -funroll-loops:可以提供一些紧凑的循环,但即使在-O3也无法启用。不要用于所有事情,因为更大的代码大小会导致I-cache错过,这会造成更多伤害。 -fprofile-use确实启用了此功能,因此理想情况下只需使用PGO。
  • -fblah-blah:有更多具体选项。通常只需使用-O3来选择推荐的设置。