因此,让我们考虑下面的代码片段:
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
}
}
我认为这可能是一个不好的做法的原因是因为对于循环的每个实例,正在针对第一个片段执行条件检查,在第一个片段中首先检查条件,然后是循环执行。我错了吗?
答案 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.
}