Javascript中的布尔与Int

时间:2011-08-28 15:48:53

标签: javascript performance boolean int

我总是认为布尔值比存储开/关值时更有效 - 考虑到它们存在的原因。我最近决定在jsperf的帮助下检查这是否属实,并且它得出了一些相反的结果!

http://jsperf.com/bool-vs-int

这是我尝试过的第一个测试。切换开/关开关的值。在Chrome上使用1/0这样做速度明显更快,但在Firefox上使用bool执行此操作要快一些。有趣。

http://jsperf.com/bool-vs-int-2

这是我试过的第二次测试。在条件中使用它们。与bools相比,这似乎具有明显的优势,使用1/0而不是布尔 - 在firefox和chrome上都快了70%。跆拳道?

我想我的问题是,我做错了吗?为什么在布尔的工作中注册更好?是使用bool清晰度的唯一价值,还是我错过了一些重要的东西?

4 个答案:

答案 0 :(得分:17)

免责声明,我只能代表Firefox,但我认为Chrome很相似。

第一个例子(http://jsperf.com/bool-vs-int):

  1. 不操作 JägerMonkey(Spidmonkey的JavaScript methodjit)首先检查布尔值的检查,然后只检查xors,这非常快(我们不知道a / b的类型,所以我们需要检查类型)。 第二个检查是针对int的,所以如果a / b是一个int,这会慢一点。 Code

  2. 减去操作。 我们再次不知道c / d的类型。再次,你很幸运我们将首先采用整数和内联。但是因为在JavaScript编号操作中指定为IEEE 754双倍,我们需要检查溢出。所以唯一的区别是溢出的“sub”和“条件跳转”与情况1中的普通xor。 Code

  3. 第二个例子: (我不是100%肯定这些,因为我之前从未真正看过这个代码)

    1. 和3. 如果。 我们内联检查布尔值,所有其他情况最终调用一个函数将值转换为布尔值。 Code

    2. 比较和。 从实现的角度来看,这是一个非常复杂的案例,因为优化平等操作非常重要。所以我认为我找到了正确的代码,似乎建议我们首先检查double,然后检查整数。 因为我们知道比较的结果总是布尔值,所以我们可以优化if语句。 Code

    3. 跟进我转储了生成的机器代码,如果您仍然感兴趣,请here you go

      总的来说,这只是一张更大的图片。如果我们知道变量的类型是什么,并且知道减法不会溢出,那么我们可以使所有这些情况同样快。 这些努力正在IonMonkey或v8的Crankshaft进行。这意味着您应该避免根据此信息进行优化,因为:

      1. 它已经很快了
      2. 引擎开发人员负责为您优化
      3. 将来会更快。

答案 1 :(得分:0)

由于“function”和“var”的定义以及对函数的调用,你的测试有点过时了。定义函数和变量并调用它们的成本因引擎而异。我修改了你的测试,试着用你的浏览器重新运行(注意IE已关闭,因为第一次运行很奇怪,但是连续运行是按照预期的那样bool最快):http://jsperf.com/bool-vs-int-2/4

答案 2 :(得分:0)

我不知道,但在第二次测试中确实如此 if(a) bluh();
VS
if(c == 1) bluh();

也许c==1更快,因为您将某个值与具有相同类型的值进行比较 但是如果你做if(a)那么js需要检查值是否为真,而不仅仅是它是否为真...

这可能就是原因......

也许我们需要测试 if(c==1)
VS
if(a===true)有三个=

答案 3 :(得分:0)

对我来说,选择将基于API使用。始终返回最有用的内容。如果我使用二级代码,我会赞成返回布尔值的方法。这可能使代码准备好被链接。另一种方法是提供重载方法。