for 循环中的 if 条件 - 性能差异
if condition in for loop - performance difference
条件一
for( var i = 0; i < 1000; i++ ) {
if( i != 0 ) {
console.log("i is not zero.!");
} else {
console.log("i is zero.!");
}
}
条件二
for( var i = 0; i < 1000; i++ ) {
if( i == 0 ) {
console.log("i is zero.!");
} else {
console.log("i is not zero.!");
}
}
哪种方法更好(我的意思是更合适).?
这两者在性能上有区别吗?
两种方法都会产生相同的结果。这两种方法之间没有任何性能和效率差异。您可以使用其中任何一个。
在您的条件 1 和 条件 2 中,输出将是
i is zero.!
然后是999次
i is not zero.!
- 无论您使用哪个条件,它都将保持不变。
- 不,不会有任何性能差异。执行的迭代次数保持不变
您可能听说过处理器如何预测是否进行跳跃以便同时计算多个相关操作。这在某些情况下是相关的,但在您的情况下,无论您以何种顺序执行这些操作,处理器都会正确预测。
无论如何,这样的事情最多只需要纳秒。当涉及核心机制而不是常规应用程序时,您会进行此类考虑。
我什至不确定这样的事情是否会与 JavaScript 一起工作,可能不会,因为它被解释了。
最有可能的是,对于您的程序而言,跟上可读性之类的事情要重要得多。
试试吧!
还有另一种方法可以做到这一点:
console.log( i==0 ? "i is zero.!" : ""i is not zero.! );
有一点板凳:
function run(e) {
var start=1*new Date();
var loop=loopcnt.value;
if (e.target.id=="==") {
for( var i = 0; i < loop; i++ ) {
if( i == 0 ) {
var log="i is zero.!";
} else {
var log="i is not zero.!";
}
}
} else if (e.target.id=="!=") {
for( var i = 0; i < loop; i++ ) {
if( i != 0 ) {
var log="i is not zero.!";
} else {
var log="i is zero.!";
}
}
} else if (e.target.id=="(=") {
for( var i = 0; i < loop; i++ ) {
var log=i==0?"i is zero.!":"i is not zero.!";
}
} else {
for( var i = 0; i < loop; i++ ) {
var log=i!=0?"i is not zero.!":"i is zero.!";
}
};
elapsed.innerHTML=(1*new Date()-start).toFixed(0)+"ms."
}
body,button,input{font-family:sans;font-size:8pt;padding:0pt}div{font-size:12pt;}
Loop: <input id=loopcnt value="3000000" size="8" />
<button id="==" onclick="run(event)">if == {} else {}</button>
<button id="!=" onclick="run(event)">if != {} else {}</button>
<button id="(=" onclick="run(event)">( == ? "" : "" )</button>
<button id="(!" onclick="run(event)">( != ? "" : "" )</button>
<div id="elapsed"></div>
通过使用 firefox 或 chrome,没有明显的区别,但是 Spidermonkey 似乎使用 !=
比使用 ==
:
更快
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
if ( i == 0 ) { var log="i is zero.!"; }
else { var log="i is not zero.!"; } } '
real 0m0.054s
user 0m0.044s
sys 0m0.004s
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
if ( i != 0 ) { var log="i is not zero.!"; }
else { var log="i is zero.!"; } } '
real 0m0.043s
user 0m0.040s
sys 0m0.000s
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
var log=(i==0?"i is zero.!":"i is not zero.!"); } '
real 0m0.051s
user 0m0.048s
sys 0m0.000s
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
var log=(i!=0?"i is not zero.!":"i is zero.!"); } '
real 0m0.049s
user 0m0.040s
sys 0m0.008s
但这没有经过充分测试(在真正免费的主机上,通过做大量测试和完整统计)。
例如,如果您使用的是稀疏矩阵并且您不知道值但知道大多数项的值为零,则最好使用条件 2。
如果您无法估计零计数,最好使用:
for( var i = 0; i < 1000; i++ ) {
bool a = i;
switch(a){
case true:
console.log("i is not zero");
break;
case false:
console.log("i is zero");
break;
}
}
条件一
for( var i = 0; i < 1000; i++ ) {
if( i != 0 ) {
console.log("i is not zero.!");
} else {
console.log("i is zero.!");
}
}
条件二
for( var i = 0; i < 1000; i++ ) {
if( i == 0 ) {
console.log("i is zero.!");
} else {
console.log("i is not zero.!");
}
}
哪种方法更好(我的意思是更合适).?
这两者在性能上有区别吗?
两种方法都会产生相同的结果。这两种方法之间没有任何性能和效率差异。您可以使用其中任何一个。
在您的条件 1 和 条件 2 中,输出将是
i is zero.!
然后是999次
i is not zero.!
- 无论您使用哪个条件,它都将保持不变。
- 不,不会有任何性能差异。执行的迭代次数保持不变
您可能听说过处理器如何预测是否进行跳跃以便同时计算多个相关操作。这在某些情况下是相关的,但在您的情况下,无论您以何种顺序执行这些操作,处理器都会正确预测。
无论如何,这样的事情最多只需要纳秒。当涉及核心机制而不是常规应用程序时,您会进行此类考虑。 我什至不确定这样的事情是否会与 JavaScript 一起工作,可能不会,因为它被解释了。
最有可能的是,对于您的程序而言,跟上可读性之类的事情要重要得多。
试试吧!
还有另一种方法可以做到这一点:
console.log( i==0 ? "i is zero.!" : ""i is not zero.! );
有一点板凳:
function run(e) {
var start=1*new Date();
var loop=loopcnt.value;
if (e.target.id=="==") {
for( var i = 0; i < loop; i++ ) {
if( i == 0 ) {
var log="i is zero.!";
} else {
var log="i is not zero.!";
}
}
} else if (e.target.id=="!=") {
for( var i = 0; i < loop; i++ ) {
if( i != 0 ) {
var log="i is not zero.!";
} else {
var log="i is zero.!";
}
}
} else if (e.target.id=="(=") {
for( var i = 0; i < loop; i++ ) {
var log=i==0?"i is zero.!":"i is not zero.!";
}
} else {
for( var i = 0; i < loop; i++ ) {
var log=i!=0?"i is not zero.!":"i is zero.!";
}
};
elapsed.innerHTML=(1*new Date()-start).toFixed(0)+"ms."
}
body,button,input{font-family:sans;font-size:8pt;padding:0pt}div{font-size:12pt;}
Loop: <input id=loopcnt value="3000000" size="8" />
<button id="==" onclick="run(event)">if == {} else {}</button>
<button id="!=" onclick="run(event)">if != {} else {}</button>
<button id="(=" onclick="run(event)">( == ? "" : "" )</button>
<button id="(!" onclick="run(event)">( != ? "" : "" )</button>
<div id="elapsed"></div>
通过使用 firefox 或 chrome,没有明显的区别,但是 Spidermonkey 似乎使用 !=
比使用 ==
:
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
if ( i == 0 ) { var log="i is zero.!"; }
else { var log="i is not zero.!"; } } '
real 0m0.054s
user 0m0.044s
sys 0m0.004s
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
if ( i != 0 ) { var log="i is not zero.!"; }
else { var log="i is zero.!"; } } '
real 0m0.043s
user 0m0.040s
sys 0m0.000s
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
var log=(i==0?"i is zero.!":"i is not zero.!"); } '
real 0m0.051s
user 0m0.048s
sys 0m0.000s
time smjs <<<'
for( var i = 0; i < 10000000; i++ ) {
var log=(i!=0?"i is not zero.!":"i is zero.!"); } '
real 0m0.049s
user 0m0.040s
sys 0m0.008s
但这没有经过充分测试(在真正免费的主机上,通过做大量测试和完整统计)。
例如,如果您使用的是稀疏矩阵并且您不知道值但知道大多数项的值为零,则最好使用条件 2。
如果您无法估计零计数,最好使用:
for( var i = 0; i < 1000; i++ ) {
bool a = i;
switch(a){
case true:
console.log("i is not zero");
break;
case false:
console.log("i is zero");
break;
}
}