0

如果我有一个数据集中的变量在大多数情况下评估为真,我应该将它放在“if”子句或“else”子句中。一个比另一个快吗?我确信这取决于 JavaScript 引擎和/或操作系统之类的东西,因为它被转换为机器语言。

像这样:

var usualyTrue;
// some more code here...
if(usualTrue)
    //do something
else
    //do something else

或像这样:

var usualyTrue;
// some more code here...
if(!usualTrue)
    //do something
else
    //do something else
4

4 回答 4

2

它通常没关系,所以你应该做任何使它最易读的事情。

三个原因。

  1. 编译器足够聪明,在大多数情况下,它不会太在意这些条件中的哪一个(除非您进行数百万/数十亿次比较,布尔值是最便宜的评估)
  2. 分支(在 ISA 级别)确实意味着这无关紧要。像这样的简单比较基本上是通过流水线同时评估的。
  3. 您花在优化这样的事情上的时间会更好地花在思考“如何减少我进行的 AJAX 调用的数量?”上。或“我是否在某些时候不必要地循环遍历 DOM?”

如果您只是对生成的内容感到好奇,您可以使用Rhino之类的工具自己编译 JS 。

于 2013-03-20T00:45:47.433 回答
1

你不应该担心哪个更快,因为如果有任何差异,它会稍微快一点,你只是掉进了过早优化的陷阱。

当前的浏览器(以及除 JavaScript 之外的其他语言的编译器/解释器)对布尔逻辑进行了各种优化,因此您不必担心这一点。

于 2013-03-20T00:44:39.170 回答
0

确实没有严重的性能差异,但检查 if(usualTrue) 似乎更有意义。如果您知道什么通常为真,则可以避免不必要地评估经常为假的表达式。

于 2013-03-20T00:42:47.913 回答
0

为可读性而写

无论哪种方式都没有性能差异,对您来说重要的是编写可读性,即使用有意义的变量名和适当的逻辑。

例如

var errorFound;
// some more code here...
if(errorFound) {
    //do something
} else {
    //do something else
}

避免双重否定:

var noErrorFound;
// some more code here...
if(!noErrorFound) {
    //do something
} else {
    //do something else
}

因为这使得它难以阅读 - 输入你正在寻找的 else !!noErrorFound- 这只会让调试变得更加困难:)。

于 2013-03-20T00:51:04.420 回答