if语句在循环中的潜在影响

Arr*_*rrr 4 c#

假设我们有Boolean check = false,并且这个变量的值要么总是真或假意味着它永远不会通过循环改变,那么下面的计算效率会比后者更高吗?

第一:

// The value of check variable never changes inside the loop.
if(check){
   for(int i=0; i < array.Length; i++){
       sb.Append(String.Format("\"{0}\"", array[i].ToString());
   }
}
else{
   for(int i=0; i < array.Length; i++){
       sb.Append(String.Format("{0}", array[i].ToString());
   }
}
Run Code Online (Sandbox Code Playgroud)

第二:

for(int i=0; i < array.Length; i++){
   if(check){
      sb.Append(String.Format("\"{0}\"", array[i].ToString());
   }
   else{
      sb.Append(String.Format("{0}", array[i].ToString());
   }
}
Run Code Online (Sandbox Code Playgroud)

Sef*_*efe 5

对此没有一般性的答案,尤其是在现代CPU上.

理论上

从理论上讲,代码中的分支越少越好.因此,由于第二个语句在每次循环迭代时重复一次分支,因此需要更多的处理时间,因此效率较低.

在实践中

现代CPU执行所谓的分支预测.这意味着他们试图提前弄清楚是否有分支机构.如果预测是正确的,所述分支是自由(free如在0 CPU周期),如果不正确,则CPU必须刷新其执行队列和分支是非常昂贵(如在多于1个CPU周期).

在您的具体示例中,您有两种分支类型,循环和分支类型if.由于您的条件if没有改变并且循环具有固定数量的执行,因此两个分支对于分支预测引擎的预测都是微不足道的,并且您可以期望两个替代方案执行相同的操作.

在编码实践中

性能考虑很少在实践中产生影响(特别是在这种情况下,因为分支预测),因此您应该选择更好的编码风格.我认为第二种选择在这方面会更好.