【问题标题】:Function wont eager compile函数不会急于编译
【发布时间】:2022-02-11 02:48:53
【问题描述】:

我最近尝试从链接中显示的指南中急切编译我的 javascript 函数-https://v8.dev/blog/code-caching-for-devs

但即使在如上所述将函数包含在 IIFE 启发式中之后,V8 System analyzer shows its lazy compiled, and unoptimized.它没有显示在急切的编译部分下。然而,创建时间移到了前面,但没有明显的性能变化。这是否意味着急切的编译功能不会执行得更快?那么 Eager compile 函数到底有什么优势呢?

(请注意,以下函数是为了学习目的而创建的。我用它来学习急切编译 js 函数): script.js:

const a = 1000;
const b = 2000;

const add = function(a,b) {
    var sampleObject2={
        firstName: "John",
        lastName: "Doe",
        age: 70,
        eyeColor: "blue"
      };
    var c=a**b;
    var d=b**c;
    c=c+21;
    d=d+c;
    d=d**sampleObject2.age;
    console.log(c**d);
    return c**d;
};
window.addEventListener("click", ()=>{
  var start=performance.now()
  add(a,b);
  var end=performance.now()
  console.log(end-start);
},false);

【问题讨论】:

  • @Bravo 我实际上只是在学习急切的编译功能。所以它只是一个虚拟函数..

标签: javascript performance google-chrome google-chrome-devtools v8


【解决方案1】:

(这里是 V8 开发人员。)

V8 系统分析器显示其惰性编译

这不是我所看到的:使用您问题中编写的代码,即const add = function(a, b) { ... };,系统分析器显示type: LazyCompile~
当我添加(当前!)被解释为急切编译提示的括号时,即const add = (function(a, b) = { ... });,它会更改为type: Function~(如您的屏幕截图所示;所以我猜您确实在运行测试之前添加了括号生成了那个屏幕截图)。

未优化

这是意料之中的。优化与惰性编译无关。没有办法立即优化函数,因为尝试这样做是没有意义的:如果没有类型反馈可以使用,优化器将无法做任何有用的事情,而这些反馈只能在未优化的执行期间收集。

这是否意味着 Eager compile 函数不会执行得更快?

没错,函数本身的性能完全没有变化。

那么 Eager compile 函数到底有什么优势呢?

为以后的惰性编译准备函数的成本很小。如果很快需要该功能,立即编译它可以避免这种成本。事实上,我确实看到你的测试报告的时间有微小的差异。虽然我还没有验证这种差异实际上是由于急切编译还是惰性编译造成的,但很可能是由其他原因引起的。

如果急切编译一切都是一个好主意,那么引擎就会这样做——那会容易得多。实际上,延迟编译几乎总是值得它创建的少量额外工作,因为它使启动/页面加载更快,并且可以在有未使用的函数时避免相当多的内存消耗,例如在您包含的库中。因此 JavaScript 引擎接受了很多内部复杂性来使惰性编译成为可能。我不建议尝试回避这一点。

(为了完整性:几年前 V8 的惰性编译实现不如今天优化,手动提示 Eager 编译可以实现更显着的改进,尤其是对于深度嵌套的函数。但这些时代已经过去了!而且现在这只是另一个示例,说明通常您不应该竭尽全力使您的代码适应引擎当前做得好还是不好。)

【讨论】:

  • 非常感谢!老实说,了解V8 tools 非常困难,因为关于它的信息很少。您能否为 V8 工具和 V8 本身推荐一些好的资源? V8 工具中使用的术语(尤其是 indicium)有点令人困惑..
  • @AshwinKumar 是的,这些工具并不是真正针对公众消费的,它们主要是由使用它们的人编写的(因此他们已经非常熟悉相关主题)。要了解整个 V8,v8.dev/blog(您已经找到)可能是最大的资料集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
相关资源
最近更新 更多