【问题标题】:Does the order of the constant operand with any arithmetic operator affect optimization?带有任何算术运算符的常量操作数的顺序是否会影响优化?
【发布时间】:2023-03-24 06:21:01
【问题描述】:

假设我们定义了constconstexpr,并且我们多次执行简单的算术运算符,变量和函数调用也不会表达或返回常量

    #define NU = 3; //Macro or
    const int NU = 3 // general declaration or constexpr
    auto NU = []()constexpr -> int { return 3;}
    int result = 0;

   #Approach one -> const NU on left side of the operator right side could be function call or a function parameter
    for(int i = 0; i< SOME_MAX; ++i) result = NU * foo(); // function call or
    for(int i = 0; i< SOME_MAX; ++i) result = NU * var; // variable

   #Approach two -> const NU on Right side of the operator Left side could be function call or a function parameter
    for(int i = 0; i< SOME_MAX; ++i) result = foo() * NU ;// function call or
    for(int i = 0; i< SOME_MAX; ++i) result = var * NU; // variable

哪种方法会生成优化的程序集 -> 机器码?

对于算术运算符而言,LHS 或 RHS 上的常量操作数是否会影响 优化性能

注意 - 在这里我用它来描绘我的想法,性能损失或效率低下可以忽略不计,但假设使用一堆常量进行复杂的数学运算。

谢谢。

【问题讨论】:

  • 应该很少或永远需要这种微优化。请花一些时间阅读how to ask good questionsthis question checklistthe XY problem。然后请编辑您的问题,包括您尝试解决的问题、您为什么需要这个,或者这是否只是出于好奇。
  • 另请注意,此类微优化往往是特定于编译器的(甚至可能是特定于编译器的版本)。
  • 如果你想知道,你可以在Compiler Explorer上试试你的编译器。 (并不是说我预计会有显着差异。)
  • 顺便说一句:#define NU = 3; => #define NU 3.
  • MSVC 搞得一团糟,因为@Scheff 的链接很傻:MSVC 不支持-O3/O3,所以它会忽略它并在调试模式下编译。使用-O2-Ox 进行MSVC 的全面优化。 (但-O3 使用 gcc 或 clang 进行全面优化)。 gcc.godbolt.org/z/lwa5xz 显示 MSVC 按预期工作:mov edx, 9 for NU() * 3

标签: c++ assembly optimization c++17 compiler-optimization


【解决方案1】:

应该是一样的。 大多数现代编译器将在编译时评估和传播常量。该理论称为Constant folding 或常量传播。

编辑:就哪一方而言,它不应该是不同的。虽然,我认为在定理证明者中,比如 coq,证明 RHS 优化比 LHS 优化更难(或者可能反过来......我忘了。)。

【讨论】:

  • 感谢 Bar Stool 的回复,你能不能通过这个 -> godbolt.org/z/Y7kONZ ,切换到不同的编译器并查看生成的输出,MSVC 是迄今为止我得到的最差的。例如检查 iCCx64,clang,arm,gcc :)
  • 你有没有发现什么奇怪的地方?
  • 看来 MSVC 只做了 1 轮常量折叠,所以它仍然乘以第一个常量。
  • 我认为this 很有趣。 clang 甚至会为你折叠循环:)
  • @BarStool: MSVC -O3 是一个被忽略的未知选项;您正在查看调试模式输出!您希望 -O2-Ox 用于 MSVC 全面优化,这与 -O3 用于 gcc/clang 不同(加上 -march=native 如果您的二进制文件只需要在本地运行。)gcc.godbolt.org/z/lwa5xz
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 2011-12-10
  • 1970-01-01
  • 2021-12-23
  • 2022-09-30
  • 1970-01-01
  • 2018-08-19
  • 2015-09-17
相关资源
最近更新 更多