我们有一个代码库,开发人员在其中实现了以下条件分配。本质上,所有四个条件(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
<-> b
和 c
<-> d
是互补的,你也可以这样做:
...
else if (condition1) {
a = condition2 ? m : 0;
b = m - a;
c = condition2 ? n : 0;
d = n - c;
}
关于c++ - 同一类型的多个条件赋值 - 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77496195/