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

标签 c++

我们有一个代码库,开发人员在其中实现了以下条件分配。本质上,所有四个条件(condition2)都检查相同的事情(例如i==j),并编写如下

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

虽然这看起来很紧凑(并且更具可读性?对此不确定),但我认为将它们放入 if else 语句中,因为这样可以节省 4 次相同的 if 检查并提高性能。现有的方法是否可取,或者重写为单个 if else 是否可取?

最佳答案

一般来说,编译器会找出最适合执行的内容。作为一名程序员,您应该关注可读性。

例如,使用 -O3 优化的代码会导致 condition2 仅被评估一次。参见这里:https://godbolt.org/z/4fs8efjoa

如果您的目标是微优化,理论上您可以通过重写代码来完全避免分支,如下所示:

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

它在条件2上没有分支,但更难理解。参见这里: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

关于c++ - 同一类型的多个条件赋值 - 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77496195/

相关文章:

c++ - 如何使我的 C++ 库符合 IEEE 754

c++ - 如何在 XML 中格式化 Google Protocol Buffers 对象并从 XML 中解析

c++ - 将 C++ 方法作为函数指针传递?

c++ - Scala 和 C++11 的类型推断有什么区别?

c++ - 为什么带大括号的复制初始化会省略复制/移动构造?

c++ - 在窗口操作系统中从 c 命令启动应用程序

c++ - 模板参数 - 带有可变参数的函数指针

c++ - 如何在 C++ 中将 const FB::variant& 转换为用户定义的类?

c++ - Boost::shared_ptr 使用这个实例化

c++ - 在不产生动态查找成本的情况下拥有通用代码接口(interface)的好方法是什么?