假设我们有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)
对此没有一般性的答案,尤其是在现代CPU上.
理论上
从理论上讲,代码中的分支越少越好.因此,由于第二个语句在每次循环迭代时重复一次分支,因此需要更多的处理时间,因此效率较低.
在实践中
现代CPU执行所谓的分支预测.这意味着他们试图提前弄清楚是否有分支机构.如果预测是正确的,所述分支是自由(free如在0 CPU周期),如果不正确,则CPU必须刷新其执行队列和分支是非常昂贵(如在多多于1个CPU周期).
在您的具体示例中,您有两种分支类型,循环和分支类型if.由于您的条件if没有改变并且循环具有固定数量的执行,因此两个分支对于分支预测引擎的预测都是微不足道的,并且您可以期望两个替代方案执行相同的操作.
在编码实践中
性能考虑很少在实践中产生影响(特别是在这种情况下,因为分支预测),因此您应该选择更好的编码风格.我认为第二种选择在这方面会更好.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |