Javascript中的布尔与Int

Thr*_*art 18 javascript int performance boolean

我总是认为布尔值比存储开/关值时更有效 - 考虑到它们存在的原因.我最近决定在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清晰度的唯一价值,还是我错过了一些重要的东西?

evi*_*pie 17

免责声明,我只能代表Firefox,但我猜Chrome与此类似.

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

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

  2. 减法操作. 我们再次不知道c/d的类型.再次,你很幸运我们将首先采用整数和内联.但是因为在JavaScript编号操作中指定为IEEE 754双倍,我们需要检查溢出.所以,唯一不同的是"分",并在情况1."条件跳转"溢出相对于单纯的XOR

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

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

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

后续我转储了生成的机器代码,所以如果您仍然感兴趣,请转到此处.

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

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