在if语句中选择正确的条件

时间:2016-11-10 17:22:56

标签: javascript performance

让我们假设我有这段代码:

if (a == 'something') {
  doA();
} else {
  doB();
}

我主要关心的是表现。如果在大多数(几乎99%)案例中a不等于'something',我是否需要反转条件和块?

if (a != 'something') {
  doB();
} else {
  doA();
}

6 个答案:

答案 0 :(得分:2)

您有条件决定只有2种可能的结果truefalse。你不能对这种情况真的做任何事情。

如果您有以下情况:

if (a == 'something') {
  doA();
} else if (a == 'something else') {
  doB();
} else if (a == 'something else else') {
  doC();
} else {
  doD();
}

并且你会说条件a == 'something else else'在大多数情况下都是正确的,那么你一定要把它移到顶部,这个micro optimization是有道理的。

但在现有的示例中,您需要执行最少的代码

答案 1 :(得分:2)

引擎将比你更好地优化它。我觉得有点难以相信这确实是代码中的瓶颈所在。这是剖析器的意思吗?

有一个"分支预测"的概念,其中引擎决定哪个替代品更有可能,并组织机器代码,以便代码在更常见的情况下落实并且只接受JMP不太常见的情况。

然而,即使没有这样的优化,假设代码由引擎优化,两种情况的差异可能在几十纳秒的水平,即使代码没有针对任何优化原因,正在被解释",差异将以微秒为单位。如果每个页面视图涉及十个这样的条件语句,则服务器上每天的额外总负载可能是几十秒的CPU时间。

在考虑此问题或进行基准测试时,请注意根据评估条件所需的时间差异可能会有所不同。例如,!b的评估时间比b要长。如果你能找到一种方法来优化比较 - 因为字符串比较可能比数字比较更昂贵 - 这可能会给你带来一些东西。

答案 2 :(得分:0)

不,你不需要那个。 if只是一个条件语句,无论如何代码都需要选择它是真还是假;

答案 3 :(得分:0)

没有任何改进,因为在任何情况下都会检查条件,并采取相应的分支。

如果你有几个if条件,那么一个(无关的)建议就是这样写:

if ('something' == a) {
  doA();
} else {
  doB();
}

这是因为很容易使a = 'something'相等,它将被视为一项任务。

答案 4 :(得分:0)

以下是如何加快速度测试的方法。通过使用JSFiddle和Chrome的快速测试,我有时但并不总是发现反转条件节省了一些时间(我最初得到的时间分别为11.6秒和6.7秒),但它可能与平台有关并且/或者取决于{ {1}}函数。

如果这是客户端代码,那么除非为每个用户执行相同的决策数千或数百万次,否则这不太可能对性能产生明显影响。

doSomething

JSFiddle

答案 5 :(得分:0)

大多数答案都有正确的结论,错误的推理。

if (condition) {
   // do X
} else {
   // do something that takes exactly the same amount of time as X
}

condition为真的传递的性能绝对不同于condition为假的传递的性能。如何以及为什么依赖于执行指令的机制,一直到微处理器 - 当我们讨论在Web浏览器中解释的语言时,这使得准确的讨论变得非常困难。

幸运的是并不重要。编译器,运行时引擎,甚至微处理器本身都能正确处理这种优化级别,因为(a)手动完成这项工作是不可能的,而且(b)从长远来看,尝试这样做的可能性不会适得其反。 - 而不是代码运行的频率 - 是什么让它成为微观优化,不值得花时间。