在这个test中,我正在研究函数表达式的两种不同方式;使用感叹号一元运算符并使用括号。
以下是2项测试:
var f = !function() {};
var f = (function() {});
鉴于以下结果,当我看到一元操作符测试比Firefox中的括号测试快〜5261%时,我很感兴趣。
正在进行哪种优化会使Firefox的性能大幅提升,使其他浏览器相形见绌?
答案 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,因此我在上面描述的优化在那里是无效的。