为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript (V8) 是否优化了未使用的返回值

Javascript (V8) 是否优化了未使用的返回值

30秒到达战场 2022-09-02 17:02:11
假设我们有一个这样的函数:function foo() {  // do some work...  return () => {}; // foo returns a function}客户端代码可以在两种情况下使用:foo使用函数的结果const result = foo();// some code that uses result...忽略函数的结果foo();我想知道运行时(我不想引用语言本身,因为它很可能是依赖于实现的)是否会优化第1rst情况,所以我不必像这样自己做:function foo(needTheResultValue = false) {  // do some work...  if (needTheResultValue) return () => {};  // nothing is returned if the caller didn't ask for it}
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

V8 开发人员在这里。简短的回答是“视情况而定,不要担心”。


一般来说,据我所知,V8(和其他引擎)会根据每个功能进行优化。因此,在您的示例中,如果优化了,则不知道其返回值是将被使用还是被忽略,因此它无法对其进行优化。foo


例外情况是内联:优化编译器能够在优化调用函数时内联调用函数,例如在此示例中:


function foo() {

  // Do some FOO work...

  return {};

}

function bar() {

  foo();

  // Do some BAR work...

}

优化后,它将(继续)返回一个新分配的空对象,无论它从何处调用。当被优化时,编译器可能会决定内联,并且在该步骤之后,它会看到(它自己的假设函数的内部表示,例如):foobarfoo


function bar() {

  // Do some FOO work...

  {};

  // Do some BAR work...

}

然后,它可以很容易地将未使用的对象分配放在那里。


也就是说,正如对这个问题的评论所指出的那样,这不是你需要担心的事情。(除非你碰巧不必要地花费大量时间来构建昂贵但未使用的返回值 - 但这似乎不太可能,因为这是一个相当明显的低效率,所以你很可能不会首先编写这样的代码。


特别是,与不返回任何内容相比,返回您计算的某个值的成本为零,因为每个函数总是返回一些东西 - 如果它没有语句,那么引擎将悄悄地为您插入一个。这意味着并且将编译为完全相同的代码。如果你决定写这样的东西:returnreturn undefined;function f1() {}function f2() { return undefined; }


function overly_clever(need_result) {

  let result = do_some_work();

  if (result < 0) handle_error();


  if (need_result) {

    return result;

  } else {

    // Return nothing.

  }

}

那么这个函数会比你用一个简单的替换空行后面的所有内容稍微慢(不可测量),因为“空”-branch(自动插入)并不比 快,所以评估条件是浪费时间。return resultelsereturn undefined;return resultneed_result


所以,简而言之:不要担心它。编写有意义的代码,让引擎负责优化它。


(为了完整性:如果你确实觉得需要进行手动优化工作,请通过测量来指导它:分析你的应用以查看花费最多时间的位置,并测量任何尝试更改的效果以查看它们是否有效。不要使用微基准标记,因为它们往往会产生误导。


查看完整回答
反对 回复 2022-09-02
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信