一元运算符函数表达式比Firefox中的括号函数表达式快〜5261%

时间:2012-09-23 19:34:16

标签: javascript performance firefox

在这个test中,我正在研究函数表达式的两种不同方式;使用感叹号一元运算符并使用括号。

以下是2项测试:

var f = !function() {};

var f = (function() {});

鉴于以下结果,当我看到一元操作符测试比Firefox中的括号测试快〜5261%时,我很感兴趣。

enter image description here

enter image description here

正在进行哪种优化会使Firefox的性能大幅提升,使其他浏览器相形见绌?

3 个答案:

答案 0 :(得分:3)

第一个产生boolean,第二个产生function。对你的测试似乎没有多大的现实意义。

  

"正在进行什么样的优化会使Firefox的性能大幅提升,使其他浏览器相形见绌?"

我认为Firefox有一个优化,可以避免创建功能对象,因为它实际上从未使用过,但这只是猜测。


Here's an updated jsPerf。这个添加了两个创建布尔值的测试。请注意,他们非常接近"感叹号"在Firefox中测试。

这支持Firefox有这种特殊优化的想法。

答案 1 :(得分:0)

如果你把它放在一个更真实的生活中。例如,差异不再是真正的重要。

这些表达式很可能用于创建外部函数上下文,以便从全局上下文中封装代码,例如

!function() {
}();

(function() {
}());

在此处查看结果:http://jsperf.com/function-expressions/2

你实际上将引擎的工作加倍。但是,将函数赋值给变量可以隐式创建函数表达式

var f = function() {};

同时应用!运算符是不必要的工作。

答案 2 :(得分:0)

在“惊叹号”案件中,你的每秒操作大约为1e9次。你的CPU可能每秒大约需要1-4亿个时钟周期。所以这种情况大概需要1-4个时钟滴答。

这意味着整个事情被JIT优化为“f = false”。很可能因为类型推断检测到一元“!”始终跟随一个对象,并将其优化为“false”。

Chrome浏览器速度较慢的一个原因是Chrome中存在一元“!”的对象。返回true,因此我在上面描述的优化在那里是无效的。