【问题标题】:Is this JavaScript optimization or not? [closed]这是 JavaScript 优化与否? [关闭]
【发布时间】:2012-11-06 13:17:31
【问题描述】:

谁能解释一下下面这两个函数有什么区别?

我想知道 JavaScript 引擎是否在这里进行了某种纳米优化。

function withoutVar() {                                                                                                                   
  return 'stackoverflow';                                                                                                                    
}
function withVar() {
  var result = 'stackoverflow';
  return result;
}
var a = withoutVar();
var b = withVar();  

【问题讨论】:

标签: javascript v8 spidermonkey chakra


【解决方案1】:

某些引擎可能会执行此类优化。 Google Closure compiler 肯定会这样做:

function withVar(){return"stackoverflow"}var a=withVar();

速度几乎没有差异,但“优化”版本更短(因此客户端下载速度更快)。这是a benchmark的结果:

您可以看到“扁平”版本(没有变量声明)稍微快一些(但请查看每秒的操作数 - 这是一种甚至不值得考虑速度方面的优化)。

【讨论】:

  • James 你做了哪个基准测试?
  • @FrançoisB。 - 我不确定你是什么意思。我已在答案中链接到jsperf.com 上的测试用例。
  • 我正在寻找 jsperf。谢谢;)
  • 至少对于 v8,您正在以禁用优化的方式运行 jsperf。请参阅此处jsperf.com/flatten-return-string/2 - 比预期的速度快 2 倍以上。
【解决方案2】:

不同之处在于您的函数withVar 导致实现分别访问底层激活对象 词法环境记录。所以从技术上讲,这个函数会运行得更慢,但我们甚至不是在谈论微优化,更像是纳米优化

某些浏览器可能确实将该代码优化为直接的return 语句,用于withVarWebkit 或者至少是 Chrome 及其 V8 引擎 是很好的选择。无论哪种方式,这都是微不足道的,您不必担心这里的运行时性能。

JSPerf benchmark

我的机器 (Chrome) 上的差异约为 0.32% 在 ~7.000.000 次调用中。


我会考虑购买这样的东西的唯一论点是,前一个函数可以使用更少的字符。这样,您可以优化文件大小并减少网络流量(但即便如此,我们也必须在许多实例上优化此类语句才能真正发挥作用)

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2017-02-18
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多