javascript - JavaScript 中 boolean 值与 Int 值的比较

标签 javascript performance boolean int

我一直认为 boolean 值在存储开/关值方面比整数更有效 - 考虑到这就是它们存在的原因。我最近决定在 jsperf 的帮助下检查这是否属实,它得出了一些相反的结果!

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

这是我尝试的第一个测试。切换开/关开关的值。在 Chrome 上,使用 1/0 执行此操作要快得多,但在 Firefox 上,使用 bool 执行此操作要稍快一些。有趣。

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

这是我尝试的第二个测试。在条件中使用它们。与 boolean 值相比,这对于整数来说似乎具有显着的优势,在 Firefox 和 chrome 上使用 1/0 代替 boolean 值的速度提高了 70%。搞什么?

我想我的问题是,我做错了什么吗?为什么整数在 boolean 运算方面表现得如此出色?使用 bools 清晰度的唯一值(value)是,还是我遗漏了一些重要的东西?

最佳答案

免责声明,我只能代表 Firefox,但我猜 Chrome 也类似。

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

  1. Not 运算 JägerMonkey(Spidmonkey 的 JavaScript methodjit)首先内联 boolean 值检查,然后只内联异或,这非常快(我们不知道 a/b 的类型,因此我们需要检查类型)。 第二次检查是针对 int 的,因此如果 a/b 是 int ,则速度会慢一些。 Code

  2. 减法运算。 我们再次不知道 c/d 的类型。再次,你很幸运,我们将首先假设整数并内联。但因为在 JavaScript 中数字运算被指定为 IEEE 754 double ,所以我们需要检查是否溢出。因此,唯一的区别是情况 1 中溢出时的“sub”和“条件跳转”与普通异或。 Code

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

  1. 和 3.如果。 我们内联对 boolean 值的检查,所有其他情况最终都会调用将值转换为 boolean 值的函数。 Code

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

后续我转储了生成的机器代码,所以如果您仍然感兴趣,here you go .

总的来说,这只是更大的图景中的一小部分。如果我们知道变量的类型并且知道减法不会溢出,那么我们可以使所有这些情况都同样快。 这些努力正在通过 IonMonkey 进行。或 v8 的曲轴。这意味着您应该避免基于此信息进行优化,因为:

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

关于javascript - JavaScript 中 boolean 值与 Int 值的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221963/

相关文章:

ruby-on-rails - Ruby on Rails站点是否存在性能问题?

python - 如果变量为 0 则返回 1,如果变量为 1 则返回 0 的紧凑方法是什么?

javascript - 如何在 GSAP 和 ScrollMagic 中为底部和不透明度属性设置动画?

javascript - 在正确的位置为英国邮政编码添加空格 Javascript

Java 优先级队列 : Is it better to poll() and then add() or peek() and then remove()

list - OCaml boolean 表达式[[]] == [[]]

JavaScript:如果 var?其中 var 不是 bool

javascript - 使用按钮使用javascript更改整个网站的字体大小

javascript - jQuery 附加表单元素未提交

javascript - 有没有更好的方法来检测 nextUntil 是否定期停止?