【问题标题】:bcc64 optimizations -O1 vs -O2 still slower than bcc32 by 40% and morebcc64 优化 -O1 与 -O2 仍然比 bcc32 慢 40% 甚至更多
【发布时间】:2015-07-30 15:10:36
【问题描述】:

我有一个由 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 不适合我的环境。

还有其他我应该查看的编译器设置吗?

感谢您的帮助。

【问题讨论】:

    标签: c++ performance optimization


    【解决方案1】:

    64 位模式的主要缺点是指针大小翻倍。对齐规则也可能导致类/结构更大。也许您的代码在 32 位模式下勉强适合缓存,但不是 64 位。这是 esp。如果您的代码使用了很多指针,则很有可能。

    另一种可能性是您调用了一些外部库,并且您的 32 位版本有一些 asm 加速,但 64 位版本没有。

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

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

    • -Os:优化代码大小
    • -O0:最小/没有优化(大多数东西在每一步之后都会从 RAM 中存储/重新加载)
    • -O1: 一些优化,无需花费大量额外的编译时间
    • -O2:更多优化
    • -O3:更多优化,包括自动矢量化

    Clang 似乎没有记录它的优化选项,所以我认为它反映了 gcc。 (有options to report on optimizations it did,并使用profile-guided optimization。)有关优化选项的更多描述,请参见the latest version of the gcc manual (online):例如

    • -Ofast: -O3 -ffast-math(可能还有“不安全”的优化。)
    • -Og:优化不中断调试。推荐用于编辑/编译/调试周期。
    • -funroll-loops:可以在一些紧循环中提供帮助,但即使在 -O3 也没有启用。不要用于所有事情,因为较大的代码大小会导致 I-cache 未命中,从而造成更大的伤害。 -fprofile-use 确实启用了此功能,因此最好使用 PGO。
    • -fblah-blah:还有很多更具体的选项。通常只需使用-O3 来选择推荐的集合。

    【讨论】:

    • 谢谢你,彼得,提供这些信息。我的 DLL 确实调用了另一个外部 DLL(事实上,这是导致性能问题的条件;只要从未进行过调用,32 位和 64 位之间的性能是相同的)。我使用 AQTime 进行分析,但它只能分析 32 位应用程序。我会研究 VTUNE 看看我是否可以让它工作。再次,非常感谢!
    • re: AQTime,我应该说“我使用的版本 (8.10) 只能从 XE4 分析 32 位构建”。我今天购买了升级,有人告诉我,它也可以分析我的 64 位 XE4 版本。
    猜你喜欢
    • 2015-01-15
    • 2021-03-02
    • 2020-08-05
    • 2015-05-06
    • 1970-01-01
    • 2011-02-24
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多