Performance 在迭代中放置条件语句是一种不好的做法吗? 让我们考虑下面的片段: if(x == 0) { for(var i = 0; i < 5; ++ i) { //do something } } else { for(var i = 0; i < 5; ++ i) { //do something different } } if(x==0) { 对于(变量i=0;i
如您所见,这两个条件都在相同的for循环中迭代,但根据条件执行不同的操作。我的问题是,这样做是不是一种不好的做法:Performance 在迭代中放置条件语句是一种不好的做法吗? 让我们考虑下面的片段: if(x == 0) { for(var i = 0; i < 5; ++ i) { //do something } } else { for(var i = 0; i < 5; ++ i) { //do something different } } if(x==0) { 对于(变量i=0;i,performance,loops,if-statement,Performance,Loops,If Statement,如您所见,这两个条件都在相同的for循环中迭代,但根据条件执行不同的操作。我的问题是,这样做是不是一种不好的做法: for(var i = 0; i < 5; ++ i) { if(x == 0){ // do something }else{ // do something else } } for(变量i=0;i
for(var i = 0; i < 5; ++ i)
{
if(x == 0){
// do something
}else{
// do something else
}
}
for(变量i=0;i<5;++i)
{
如果(x==0){
//做点什么
}否则{
//做点别的
}
}
原因是,我认为这可能是一种不好的做法,因为对于循环的每个实例,都会对第一个片段执行条件检查,首先检查条件,然后执行循环。我弄错了吗?除非您编写的代码必须以高速运行且效率极高,否则请追求代码的可读性而不是效率。在本例中,我认为第二个示例更清晰,因为它的代码更少,并且是一种常见的模式
我想另一个因素是,第二个例子似乎意味着<代码> x <代码>可能改变值,而第一个例子不改变。这值得在附近放一条评论来解释选择
我的直觉会同意你的看法,第一个例子会更有效,但实际上,编译器的优化可能会使上面这样的例子很短时间内完成——它们的性能可能是相同的 下面是一些可以对循环进行优化的方法,让您有一个想法,并且(请参见答案),如果循环运行多次,可能会产生影响。如果您使用if(x = 0)
{
for(var i = 0; i < 5; ++ i)
{
//do something
}
}
else
{
for(var i = 0; i < 5; ++ i)
{
//do something different
}
}
挑剔:注意条件表达式中的
x=0
赋值。@doynax我提交了一个编辑,但由于某种原因被拒绝。@hnefatl可能是因为这会改变OP代码的行为。我们都知道这可能是一个打字错误,但这是由OP来决定的……如果你给出其他情况的例子,比如长循环或循环中的循环,那会更好。这些情况下的结果会大不相同。@ReadyFreddy我对编译器优化的了解还不够,无法提供好的示例-我将添加一些链接到相关的参考资料中,这是一个很好的观点。如果您能添加示例,请随意编辑我的答案。@hnefatl:的确如此。当优化速度时,第一种变体通常更可取,而在优化尺寸时,第二种变体更可取。注意,依赖优化器的自动托管是脆弱的,尽管如果在关键代码路径上使用,因为在一般情况下证明x
是否可能通过别名或类似方式改变是非常重要的。本地副本可能是一个有用的提示,但当然,反过来,程序员需要证明x
是常数。还值得注意的是,如果有机会做某事或做其他事情更改x
的值,则这些副本并不相等。(这总是假设OP实际上意味着x==0
,而不是x=0
)@JordiNebot是真的,但是如果你看第一个例子,你可以看到他试图选择一个任务,然后做了5次。Ofc第二个例子可能不同,可以改变x
。如果改变了,那么我的例子是Ofc无效。明白了,编辑帖子
for(var i =0; i < 5; ++ i)
{
if(x = 0){
// do something
}else{
// do something 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.
}