【问题标题】:A unary operator function expression is ~5261% faster than a brackets function expression in Firefox一元运算符函数表达式比 Firefox 中的括号函数表达式快约 5261%
【发布时间】:2012-09-23 19:34:15
【问题描述】:

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

以下是两个测试:

var f = !function() {};

var f = (function() {});

鉴于下面的结果,当我看到一元运算符测试比 Firefox 中的括号测试快约 5261% 时,我很感兴趣。

正在进行什么样的优化才能使 Firefox 的性能显着提高,使其他浏览器相形见绌?

【问题讨论】:

  • 似乎是在产生不同结果的两件事之间进行毫无意义的比较。你会在现实世界中使用第一个构造做什么?它的作用与第二个示例不同。

标签: javascript performance firefox


【解决方案1】:

第一个生成boolean,第二个生成function。您的测试似乎没有太大的现实意义。

“正在进行什么样的优化才能使 Firefox 的性能显着提高,使其他浏览器相形见绌?”

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


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

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

【讨论】:

    【解决方案2】:

    如果你把它放在一个更“现实”的例子中,区别就不再重要了。

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

    !function() {
    }();
    
    (function() {
    }());
    

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

    您实际上将那里的引擎工作加倍。但是将函数分配给变量会隐式创建 函数表达式

    var f = function() {};
    

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

    【讨论】:

    • 是的,当我尝试实际调用函数的测试时,我得到的结果是 delta 微不足道。
    【解决方案3】:

    在“感叹号”的情况下,您每秒大约执行 1e9 次操作。您的 CPU 可能每秒执行大约 1-40 亿个时钟滴答。所以这个案例大约需要 1-4 个时钟周期。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多