函数不会急于编译
Function wont eager compile
我最近尝试根据 link-https://v8.dev/blog/code-caching-for-devs
中显示的指南急切编译我的 javascript 函数
但即使如上所述将函数包含在 IIFE 启发式方法中,V8 System analyzer shows its lazy compiled, and unoptimized。它没有显示在急切的编译部分下。创建时间虽然转移到前面,但没有明显的性能变化。这是否意味着 eager compile 函数不会执行得更快?那么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);
(此处为 V8 开发人员。)
the V8 System analyzer shows its lazy compiled
这不是我所看到的:使用您问题中编写的代码,即 const add = function(a, b) { ... };
,系统分析器显示 type: LazyCompile~
。
当我添加括号时(当前!)被解释为 eager-compilation 提示,即 const add = (function(a, b) = { ... });
,它变为 type: Function~
(如您的屏幕截图所示;所以我猜您确实添加了运行 生成该屏幕截图的测试之前的括号)。
and unoptimized
这是意料之中的。优化与惰性编译无关。没有办法立即优化一个函数,因为尝试这样做是没有意义的:如果优化器没有可用的类型反馈,优化器将无法做任何有用的事情,而类型反馈只能在未优化的执行期间收集。
Does this mean that eager compile functions don't perform faster?
正确,函数本身的性能根本没有改变。
Then what exactly is the advantage of a eager compile function?
为以后的惰性编译准备一个函数的成本很小。如果很快需要该函数,立即编译它可以避免这种成本。实际上,我确实看到您的测试报告的时间有细微差别;虽然我还没有证实这种差异实际上是由于急切编译和惰性编译造成的,但很可能是由其他原因造成的。
如果 eager-compiling 一切都是好主意,那么引擎就会做到——那会容易得多。实际上,lazy-compiling 几乎总是值得它创建的少量额外工作,因为它使 startup/pageload 更快,并且可以在有未使用的函数时避免相当多的内存消耗,例如在您包含的库中。所以 JavaScript 引擎接受了大量的内部复杂性,使惰性编译成为可能。我不建议尝试 side-step。
(为了完整起见:几年前 V8 对惰性编译的实现并没有像今天这样优化,手动提示预编译可以实现更显着的改进,尤其是对于深度嵌套的函数。但是这些时代已经一去不复返了!现在这只是一个例子,说明通常您不应该竭尽全力使您的代码适应目前表现良好或not-so-well的引擎。)
我最近尝试根据 link-https://v8.dev/blog/code-caching-for-devs
中显示的指南急切编译我的 javascript 函数但即使如上所述将函数包含在 IIFE 启发式方法中,V8 System analyzer shows its lazy compiled, and unoptimized。它没有显示在急切的编译部分下。创建时间虽然转移到前面,但没有明显的性能变化。这是否意味着 eager compile 函数不会执行得更快?那么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);
(此处为 V8 开发人员。)
the V8 System analyzer shows its lazy compiled
这不是我所看到的:使用您问题中编写的代码,即 const add = function(a, b) { ... };
,系统分析器显示 type: LazyCompile~
。
当我添加括号时(当前!)被解释为 eager-compilation 提示,即 const add = (function(a, b) = { ... });
,它变为 type: Function~
(如您的屏幕截图所示;所以我猜您确实添加了运行 生成该屏幕截图的测试之前的括号)。
and unoptimized
这是意料之中的。优化与惰性编译无关。没有办法立即优化一个函数,因为尝试这样做是没有意义的:如果优化器没有可用的类型反馈,优化器将无法做任何有用的事情,而类型反馈只能在未优化的执行期间收集。
Does this mean that eager compile functions don't perform faster?
正确,函数本身的性能根本没有改变。
Then what exactly is the advantage of a eager compile function?
为以后的惰性编译准备一个函数的成本很小。如果很快需要该函数,立即编译它可以避免这种成本。实际上,我确实看到您的测试报告的时间有细微差别;虽然我还没有证实这种差异实际上是由于急切编译和惰性编译造成的,但很可能是由其他原因造成的。
如果 eager-compiling 一切都是好主意,那么引擎就会做到——那会容易得多。实际上,lazy-compiling 几乎总是值得它创建的少量额外工作,因为它使 startup/pageload 更快,并且可以在有未使用的函数时避免相当多的内存消耗,例如在您包含的库中。所以 JavaScript 引擎接受了大量的内部复杂性,使惰性编译成为可能。我不建议尝试 side-step。
(为了完整起见:几年前 V8 对惰性编译的实现并没有像今天这样优化,手动提示预编译可以实现更显着的改进,尤其是对于深度嵌套的函数。但是这些时代已经一去不复返了!现在这只是一个例子,说明通常您不应该竭尽全力使您的代码适应目前表现良好或not-so-well的引擎。)