比较为零的有效方法

Efficient way to compare to zero

本文关键字:有效 方法 比较      更新时间:2023-09-26

条件:有一个循环,如果某个数字变量(即moreThanZero)不是零(通常大于…),我会做一些事情。许多循环,比如说超过一百万,什么是最有效/最快速的比较方法:

if ( !moreThanZero ) { ... }
if ( moreThanZero > 0 ) { ... }
if ( moreThanZero != 0 ) { ... }
if ( moreThanZero !== 0 ) { ... }

感谢@torazaburo

if ( 0 !== moreThanZero ) { ... }

还是其他选择?

您可能是在进行微观优化,并且在大型程序中不太可能看到一次与零次比较的成本有任何重大差异。然而,为了科学。。。

调整@AbrahamAdam编写的基准测试,以防止最常见的优化(优化循环、删除变量写入等),而只调用黑洞(ish)函数,我看到了一个可能显著的区别:http://jsperf.com/comparetozero1/3

猜测为什么结果会如此:

!n是测试的最小具体操作。至少,它必须(以某种方式)将变量视为布尔值。虽然可以进行一些优化,并且一些编译器可能足够聪明,可以使用非位或数字比较,但该语言允许做更多的工作。

===!==明确不执行类型强制,因此它们可能可靠地快速,但需要注意的是,两个操作数必须是相同的类型,否则它们不相等。对于数字,这可能会变成一个整数比较,它应该映射到cmp指令。

当已知两个操作数都是数值,尤其是整数时,>可以利用优化,在现代浏览器中也可能利用优化。与常量(尤其是0)进行比较是一种理想的情况:有一条汇编指令可以与0进行比较。

http://jsperf.com/comparetozero1

差异似乎很小,我也会将类型与===进行比较,因为0==''是真正的

我假设您谈论的是循环,以及其中的比较变量。如果是,如果你想在数百万次迭代的循环中比较一个变量,我希望你更喜欢这样。

 if ( moreThanZero > 0 ) 
 {
 // Your code goes here.......
 }  

因为,

if(!moreThanZero){//Do something}说Do somethink if moreThanZero不为零。这并不意味着更多ThanZero大于零,它也可能小于零。。if(moreThanZero!=0){…}也将因相同原因被丢弃。因此,如果(moreThanZero>0){…..}可能是您所期望的答案。