gpt4 book ai didi

c++ - 扩展具有相同条件的多个 "if"会导致性能提升

转载 作者:行者123 更新时间:2023-11-27 22:48:09 24 4
gpt4 key购买 nike

假设我有

void f(const bool condition) {
if (condition) {
f2();
else {
f3();
}

f4();

if (condition) {
f5();
} else {
f6();
}
}

因为condition永远不会改变,上面的可以简化为下面的

void f(const bool condition) {
if (condition) {
f2();
f4();
f5();
} else {
f3();
f4();
f5();
}
}

请注意 f4() 在第二个代码中重复,但第二个代码部分的 if 分支较少。我试图分析这 2 个代码片段,但在我看来,性能几乎相同。想象一下,在现实生活中,上述代码片段在相同条件下可以有更多的 if。所以我想知道现代 x86/64 处理器:

  1. 使用 2 个巨大的 if 语句而不是许多基于相同条件的小语句是否有任何性能提升?
  2. const 关键字会帮助编译器/处理器生成更好的分支预测吗?

最佳答案

首先,您的示例足够简单,任何体面的编译器都可以生成 identical code对于这两种情况。

为了足够混淆它,你应该做一些更复杂的事情而不是简单地调用 f4, like so :

void f_seprate_ifs(const bool condition) {
if (condition) {
f2();
} else {
f3();
}

for ( int i = 0; i < 100; i++ ){
f4();
}

if (condition) {
f5();
} else {
f6();
}
}

void f_duplicate_f4(const bool condition) {
if (condition) {
f2();
for ( int i = 0; i < 100; i++ ){
f4();
}
f5();
} else {
f3();
for ( int i = 0; i < 100; i++ ){
f4();
}
f6();
}
}

但这不是样式问题,而是速度和空间之间的明确权衡 - 您正在复制代码以消除分支(和 IMO,这不是一个好主意对我的示例进行权衡)。编译器已经通过函数内联一直这样做,并且对何时内联有非常复杂的启发式。对于您的示例,它甚至为您完成了。

总而言之,除非您绝对确定有必要,否则不要尝试进行此类微优化。特别是当它们损害可读性时。特别是当它们引起复制粘贴错误时。

至于 const 修饰符,再一次,任何体面的编译器都会注意到 condition 永远不会改变,并且是 effectively const ,用 Java 术语来说。在 C++ 中,const 很少提供额外的优化机会。它是为程序员准备的,而不是为编译器准备的。

例如,对于:

void f(const bool& condition){

条件NOT常量——编译器必须假设它可以被f4改变,所以片段在语义上不再等同。

关于c++ - 扩展具有相同条件的多个 "if"会导致性能提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40850470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com