【问题标题】:how exactly does eval() keyword break compiler optimizations in javascripteval() 关键字究竟是如何破坏 javascript 中的编译器优化的
【发布时间】:2016-03-26 02:31:49
【问题描述】:
function func1(str) {
  eval(str);
  newVar = 100;
  function func2() {
     console.log(bar);
     console.log(newVar);
  }
  func2();
}

func1("bar = 42;");

我读过应该避免使用 eval() 关键字,因为它会欺骗词法范围(这会导致代码运行速度变慢)。结合上述示例(或任何其他示例)的上下文,我试图了解这可能最终会破坏什么样的编译器优化。

查看行 newVar = 100;这个变量也将在执行阶段由引擎(在全局范围内)创建。我不认为这等于“欺骗”词汇范围。那么 eval("bar = 42;") 的问题是什么,它本质上做了类似的事情?希望问题很清楚。

【问题讨论】:

  • 如果引擎知道它可以看到和使用哪些部分(提前,在解析时),函数可以运行得更快。代码在 "use strict" 中不起作用是一个好兆头,您正在使用 eval() 次优。
  • 你在这里问什么?
  • 将功能想象为外科医生执行手术;如果患者的 X 光片上有不清楚的区域,那么在进行仔细的手术探查的同时执行手术将需要更长的时间。
  • func1("var newVar") - 未设置全局变量。哎呀。
  • func1("bar = top.document") - 哪一行有条件地引发安全错误? eval 的那个还是console.log(bar) 的那个?

标签: javascript eval javascript-engine


【解决方案1】:

因为它们是编译器优化,传递给 eval 的代码几乎必须解释

在您的情况下,现代引擎可能足够聪明,可以意识到它是一个字符串文字并进行相应的优化,但是仍然会创建一个新的执行上下文,并且您浪费了一个函数调用。普通程序使用 eval 所做的几乎每一件事,无需 eval 即可完成。

function func1(value)
{
  var bar = value;
  var newVar = 100;
  function func2() {
     console.log(bar);
     console.log(newVar);
  }
  func2();
}

func1(42);

编辑:实际上,让我们更深入。在上面的代码中,当到达代码的console.log(bar); 部分时,不可能有bar 未定义的状态。它永远是一个数字。实际上,它总是 42。假设引擎有一个完美的优化算法,如果来自您的 eval 代码的输入是动态的,例如来自 AJAX 回复或某种形式的用户输入,那么同样适用吗? 并非总是。并且优化总是需要确定他们认为减少最终代码的事情。

【讨论】:

  • 好文章,欢迎您。一个尼特:optimizations always need to be SURE of the things they assume 不正确:CPU 缓存丢失很多,路径跟踪也是如此,但如果错误计算很快被发现,即使通常正确的猜测也可以加快速度。
  • 确实,当我说“优化”时,我在考虑高级类型推断,而不是所有其他优化。我的错。感谢您的欢迎,澄清和第一次投票^~^
猜你喜欢
  • 2016-04-22
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2014-07-23
  • 1970-01-01
  • 2011-08-06
  • 2020-10-25
相关资源
最近更新 更多