将条件语句放在迭代中是不好的做法?

时间:2017-07-25 08:15:37

标签: performance loops if-statement

因此,让我们考虑下面的代码片段:

if(x = 0)
{
     for(var i = 0; i < 5; ++ i)
     {
         //do something  
     }
}
else
{
   for(var i = 0; i < 5; ++ i)
     {
         //do something different
     }
}

如您所见,两个条件都循环遍历相同的for循环,但根据条件执行不同的操作。我的问题是,拥有这样的东西是不好的做法:

for(var i =0; i < 5; ++ i)
{
     if(x = 0){
       // do something
     }else{
        // do something else
     }
}

我认为这可能是一个不好的做法的原因是因为对于循环的每个实例,正在针对第一个片段执行条件检查,在第一个片段中首先检查条件,然后是循环执行。我错了吗?

2 个答案:

答案 0 :(得分:4)

除非您编写必须高速运行并且效率极高的代码,否则请考虑代码可读性而非效率。在这种情况下,我会说第二个例子更清晰,因为它的代码更少,并且是一个常用的模式。

我认为另一个需要考虑的因素是第二个例子似乎暗示x可能会改变值,而第一个例子则没有。这值得在附近解释选择。

我的直觉会同意你的观点,第一个例子会更有效率,但实际上编译器的优化可能会使上述例子做得很短 - 它们的性能可能相同。

这里有一个pretty impressive list优化可以在循环上进行,为你提供一个想法,而且branch optimisation(参见答案),如果循环运行多次迭代,可能会产生影响。

答案 1 :(得分:0)

如果您使用

if(x = 0)
{
     for(var i = 0; i < 5; ++ i)
     {
         //do something  
     }
}
else
{
   for(var i = 0; i < 5; ++ i)
     {
         //do something different
     }
}

然后你做了一次比较,并在一个循环中执行5次范围内的任务。

使用时

for(var i =0; i < 5; ++ i)
{
     if(x = 0){
       // do something
     }else{
        // do something else
     }
}

然后循环执行范围内的任务5次。除此之外,比较进行了5次。

乍一看,前者产生的指令数量最少。但是编译器/解释器可以通过一次进行该比较来执行优化步骤。但这取决于编译器/解释器。如果您能够很好地理解编译器/解释器如何适用于您正在编程的特定语言,那么您可能会滥用&#34;编写可读代码并具有良好优化输出的知识。

然而,另一种选择是使用功能。这种方法仅在整个循环中变量x 恒定时才有用,换句话说:您不会在循环过程中修改它。第一个例子就是这种情况。但是,在第二个示例中:x可以在循环中更改,这会导致在循环期间运行if {}else{}块,执行两个不同的函数。

替代方案:首先选择一个函数并在循环中使用它。如果您要执行许多不同的任务,它可能会更有用。只需预先选择一个功能。一些编程语言允许这样做,另一种编程语言不允许这样做。所以它取决于语言本身。

// check which function to run
variable runThisFunction;
if (x = 0) runThisFunction = { // do something }
else runThisFunction = { // do something else }

// loop 5 times using the function
for(var i =0; i < 5; ++ i)
{
     call runThisFunction with arg i provided.
}