在这个测试中,我正在研究两种不同的函数表达方式;使用感叹号一元运算符和使用括号。
以下是2个测试:
var f = !function() {};
var f = (function() {});
鉴于下面的结果,当我看到一元运算符测试比 Firefox 中的括号测试快约 5261% 时,我很感兴趣。
什么样的优化可以使 Firefox 的性能得到如此显着的提升,让其他浏览器相形见绌?
在这个测试中,我正在研究两种不同的函数表达方式;使用感叹号一元运算符和使用括号。
以下是2个测试:
var f = !function() {};
var f = (function() {});
鉴于下面的结果,当我看到一元运算符测试比 Firefox 中的括号测试快约 5261% 时,我很感兴趣。
什么样的优化可以使 Firefox 的性能得到如此显着的提升,让其他浏览器相形见绌?
第一个结果是 a boolean
,第二个结果是 a function
。您的测试似乎没有太大的现实意义。
“正在进行什么样的优化才能使 Firefox 的性能显着提高,使其他浏览器相形见绌?”
我想 Firefox 有一个优化,可以避免创建函数对象,因为它从未实际使用过,但这只是一个猜测。
这是一个更新的 jsPerf。这个添加了两个创建布尔值的测试。请注意,它们非常接近 Firefox 中的“感叹号”测试。
这支持了 Firefox 具有这种特殊优化的想法。
在“感叹号”的情况下,您每秒大约进行 1e9 次操作。您的 CPU 可能每秒执行大约 1-40 亿个时钟滴答。所以这种情况大约需要 1-4 个时钟滴答。
这意味着整个事情都被 JIT 优化为“f = false”。很可能是因为类型推断检测到一元“!” 后面总是跟一个对象,并将其优化为“假”。
在 Chrome 中速度较慢的一个原因是,在 Chrome 中,存在一元“!”的对象。返回 true,所以我上面描述的优化在那里是无效的。
如果你把它放在一个更“真实”的例子中,那么区别就不再重要了。
这些表达式最有可能用于创建外部函数上下文以从全局上下文中封装您的代码,例如
!function() {
}();
(function() {
}());
在此处查看结果:http: //jsperf.com/function-expressions/2
实际上,您在那里的引擎工作量加倍。但是将函数分配给变量会隐式创建函数表达式
var f = function() {};
同样应用!
运算符,是不必要的工作。