Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 在迭代中放置条件语句是一种不好的做法吗? 让我们考虑下面的片段: 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循环中迭代,但根据条件执行不同的操作。我的问题是,这样做是不是一种不好的做法:

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.
}