我总是认为布尔值比存储开/关值时更有效 - 考虑到它们存在的原因。我最近决定在jsperf的帮助下检查这是否属实,并且它得出了一些相反的结果!
这是我尝试过的第一个测试。切换开/关开关的值。在Chrome上使用1/0这样做速度明显更快,但在Firefox上使用bool执行此操作要快一些。有趣。
http://jsperf.com/bool-vs-int-2
这是我试过的第二次测试。在条件中使用它们。与bools相比,这似乎具有明显的优势,使用1/0而不是布尔 - 在firefox和chrome上都快了70%。跆拳道?
我想我的问题是,我做错了吗?为什么在布尔的工作中注册更好?是使用bool清晰度的唯一价值,还是我错过了一些重要的东西?
答案 0 :(得分:17)
免责声明,我只能代表Firefox,但我认为Chrome很相似。
第一个例子(http://jsperf.com/bool-vs-int):
不操作 JägerMonkey(Spidmonkey的JavaScript methodjit)首先检查布尔值的检查,然后只检查xors,这非常快(我们不知道a / b的类型,所以我们需要检查类型)。 第二个检查是针对int的,所以如果a / b是一个int,这会慢一点。 Code
减去操作。 我们再次不知道c / d的类型。再次,你很幸运我们将首先采用整数和内联。但是因为在JavaScript编号操作中指定为IEEE 754双倍,我们需要检查溢出。所以唯一的区别是溢出的“sub”和“条件跳转”与情况1中的普通xor。 Code
第二个例子: (我不是100%肯定这些,因为我之前从未真正看过这个代码)
和3. 如果。 我们内联检查布尔值,所有其他情况最终调用一个函数将值转换为布尔值。 Code
比较和。
从实现的角度来看,这是一个非常复杂的案例,因为优化平等操作非常重要。所以我认为我找到了正确的代码,似乎建议我们首先检查double,然后检查整数。
因为我们知道比较的结果总是布尔值,所以我们可以优化if
语句。
Code
跟进我转储了生成的机器代码,如果您仍然感兴趣,请here you go。
总的来说,这只是一张更大的图片。如果我们知道变量的类型是什么,并且知道减法不会溢出,那么我们可以使所有这些情况同样快。 这些努力正在IonMonkey或v8的Crankshaft进行。这意味着您应该避免根据此信息进行优化,因为:
答案 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使用。始终返回最有用的内容。如果我使用二级代码,我会赞成返回布尔值的方法。这可能使代码准备好被链接。另一种方法是提供重载方法。