我一直认为 boolean 值在存储开/关值方面比整数更有效 - 考虑到这就是它们存在的原因。我最近决定在 jsperf 的帮助下检查这是否属实,它得出了一些相反的结果!
这是我尝试的第一个测试。切换开/关开关的值。在 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):
Not 运算 JägerMonkey(Spidmonkey 的 JavaScript methodjit)首先内联 boolean 值检查,然后只内联异或,这非常快(我们不知道 a/b 的类型,因此我们需要检查类型)。 第二次检查是针对 int 的,因此如果 a/b 是 int ,则速度会慢一些。 Code
减法运算。 我们再次不知道 c/d 的类型。再次,你很幸运,我们将首先假设整数并内联。但因为在 JavaScript 中数字运算被指定为 IEEE 754 double ,所以我们需要检查是否溢出。因此,唯一的区别是情况 1 中溢出时的“sub”和“条件跳转”与普通异或。 Code
第二个例子: (我对这些不是 100% 确定,因为我以前从未真正看过这段代码)
和 3.如果。 我们内联对 boolean 值的检查,所有其他情况最终都会调用将值转换为 boolean 值的函数。 Code
比较和如果。 从实现的 Angular 来看,这是一个非常复杂的情况,因为优化相等操作非常重要。所以我认为我找到了正确的代码,这似乎建议我们首先检查 double ,然后检查整数。 因为我们知道比较的结果始终是 boolean 值,所以我们可以优化
if
语句。 Code
后续我转储了生成的机器代码,所以如果您仍然感兴趣,here you go .
总的来说,这只是更大的图景中的一小部分。如果我们知道变量的类型并且知道减法不会溢出,那么我们可以使所有这些情况都同样快。 这些努力正在通过 IonMonkey 进行。或 v8 的曲轴。这意味着您应该避免基于此信息进行优化,因为:
- 已经相当快了
- 引擎开发人员负责为您优化
- 将来会更快。
关于javascript - JavaScript 中 boolean 值与 Int 值的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221963/