c++ 相同类型的多个条件赋值-性能问题

dwbf0jvd  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(112)

我们有一个代码库,其中一个dev实现了以下条件赋值。

....
    else if (condition1){
        a = condition2 ? m : 0;
        b = condition2 ? 0 : m;
        c = condition2 ? n : 0;
        d = condition2 ? 0 : n;

字符串
虽然这看起来很紧凑(更易读?不确定),我认为,使他们成为一个if else语句,因为这将保存做同样的if检查4次,并提高性能.是现有的方法可取或重写为一个单一的if else可取?

dz6r00yl

dz6r00yl1#

一般来说,编译器会找出什么是最好的执行。作为一个程序员,你应该关注可读性。
例如,使用-O3优化的代码将导致condition2仅被计算一次。
如果你的目标是微优化,理论上你可以通过重写代码来避免分支:

...
    else if (condition1) {
        int c2 = condition2, n2 = 1 - c2;
        a = c2 * m;
        b = n2 * m;
        c = c2 * n;
        d = n2 * n;
    }

字符串
它在condition2上没有分支,但更难理解。参见这里:https://godbolt.org/z/ojrP9rf5s。(注意:乘法指令是昂贵的,但比分支错误预测便宜。)

更新:

令人意外的是,@Red.Wave在评论中发布的代码:

...
    else if (condition1) {
        std::tie(a, b, c, d) =
            condition2 ? std::tuple{m, 0, n, 0} : std::tuple{0, m, 0, n};
    }


使用-O3优化后,会产生与原始代码相同的汇编输出。参见此处:https://godbolt.org/z/YMMbYPbrj

更新:

为了完整起见,由于a <->bc <->d是互补的,你也可以这样做:

...
    else if (condition1) {
        a = condition2 ? m : 0;
        b = m - a;
        c = condition2 ? n : 0;
        d = n - c;
    }


标签:https://godbolt.org/z/Khr8zfKMq

相关问题