Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果某个函数未优化,是否意味着声明它的所有函数也未优化?_Javascript_Optimization_V8 - Fatal编程技术网

Javascript 如果某个函数未优化,是否意味着声明它的所有函数也未优化?

Javascript 如果某个函数未优化,是否意味着声明它的所有函数也未优化?,javascript,optimization,v8,Javascript,Optimization,V8,最近我遇到了这篇关于V8引擎优化JavaScript程序的文章。但是这篇文章我并不完全清楚,所以我想问几个关于这方面的问题 该条规定: 由优化编译器编译的代码可以很容易地比一般编译器生成的代码快100倍。。。 需要注意的是,导致优化的模式会影响整个包含函数 这是否意味着,例如,如果某一大块代码,比如说一个JavaScript库,它是IIFE(立即调用的函数表达式)的形式,其中包含一个try{}catch(e){}语句,并由另一个函数声明包装,那么整个库就没有得到优化? 看起来是这样,因为我试图运

最近我遇到了这篇关于V8引擎优化JavaScript程序的文章。但是这篇文章我并不完全清楚,所以我想问几个关于这方面的问题

该条规定:

由优化编译器编译的代码可以很容易地比一般编译器生成的代码快100倍。。。 需要注意的是,导致优化的模式会影响整个包含函数

这是否意味着,例如,如果某一大块代码,比如说一个JavaScript库,它是IIFE(立即调用的函数表达式)的形式,其中包含一个
try{}catch(e){}
语句,并由另一个函数声明包装,那么整个库就没有得到优化?

看起来是这样,因为我试图运行这个命令
$node--trace\u opt--trace\u deopt--allow natives syntax try\u catch.js
,try\u catch.js如下:

//Function that contains the pattern to be inspected (using with statement)
function optimizeWhack() {
    foo();
    function foo() {
        try {} catch(e) {}
    }
    return 12
}

function printStatus(fn) {
    switch(%GetOptimizationStatus(fn)) {
        case 1: console.log("Function is optimized"); break;
        case 2: console.log("Function is not optimized"); break;
        case 3: console.log("Function is always optimized"); break;
        case 4: console.log("Function is never optimized"); break;
        case 6: console.log("Function is maybe deoptimized"); break;
    }
}

//Fill type-info
optimizeWhack();

%OptimizeFunctionOnNextCall(optimizeWhack);
//The next call
optimizeWhack();

//Check
printStatus(optimizeWhack);
我得到的反应是,函数未优化:

$ node --trace_opt --trace_deopt --allow-natives-syntax try_catch.js 
[deoptimize context: ea2f6f14679]
[optimizing: optimizeWhack / ea2f6fc9c29 - took 0.033, 0.064, 0.000 ms]
**** DEOPT: optimizeWhack at bailout #1, address 0x0, frame size 8
[deoptimizing: begin 0xea2f6fc9c29 optimizeWhack @1]
  translating optimizeWhack => node=3, height=8
    0x7fff113fa238: [top + 40] <- 0xd7de9006c91 ; [sp + 40] 0xd7de9006c91 <JS Global Object>
    0x7fff113fa230: [top + 32] <- 0x1bca01a663fc ; caller's pc
    0x7fff113fa228: [top + 24] <- 0x7fff113fa268 ; caller's fp
    0x7fff113fa220: [top + 16] <- 0xea2f6f14679; context
    0x7fff113fa218: [top + 8] <- 0xea2f6fc9c29; function
    0x7fff113fa210: [top + 0] <- 0xea2f6fca051 ; rbx 0xea2f6fca051 <JS Function foo>
[deoptimizing: end 0xea2f6fc9c29 optimizeWhack => node=3, pc=0x1bca01a665ff, state=NO_REGISTERS, alignment=no padding, took 0.074 ms]
[removing optimized code for: optimizeWhack]
Function is not optimized
$node--trace\u opt--trace\u deopt--allow natives syntax try\u catch.js
[优化上下文:ea2f6f14679]
[优化:optimizeWhack/ea2f6fc9c29-耗时0.033,0.064,0.000毫秒]
****DEOPT:optimizeWhack at baily#1,地址0x0,帧大小8
[去优化:开始0xea2f6fc9c29优化重击@1]
转换优化whack=>node=3,height=8

0x7fff113fa238:[top+40]V8的优化编译器是基于函数的,因此如果无法优化某些不会影响任何其他函数的函数,包括包含此不可优化函数声明的函数

几乎所有优化编译器不支持的语句也只有局部效应——它们禁用对包含它们的特定函数的优化,但不影响包含该函数的函数。但是有一个例外:direct
eval
对所有封闭函数都有影响

函数foo(){
功能条(){
函数baz(){
eval(str);
}
}
}
在上述示例中,
foo
bar
baz
都不能通过V8曲轴进行优化

现在来看你的例子:从日志中你可以看到,
optimizeWhack
在你重新要求它的优化后确实得到了优化

[优化:optimizeWhack/ea2f6fc9c29-耗时0.033,0.064,0.000毫秒]
然而,当执行进入优化函数时,它会去优化

***DEOPT:optimizeWhack at baily#1,地址0x0,帧大小8
[去优化:开始0xea2f6fc9c29优化重击@1]
deopt的原因如下:因为您在
foo()
执行了
optimizeWhack
一次调用IC,进入了单态状态,并且V8为特定函数值指定了调用。但是,下次调用
optimizeWack
时,将创建一个新的
foo
,它不再匹配上一次调用的预期
foo
值。这会导致deopt

如果在请求优化之前将示例重写为调用
optimizeWhack
两次,则您将看到
optimizeWhack
保持优化状态:

optimizeWhack();
重击();
%OptimizeFunctionOnNextCall(optimizeWhack);
重击();
打印状态(whack);
//$d8——允许本机语法测试.js
//功能优化

“一个更一般的问题是向我指出一些关于所有这些优化内容的文献、来源等,如果它们存在的话。”离题。“提前谢谢。”这里多余!你不是在问题本身中基本上回答了这个问题吗?lol@LightnessRacesinOrbit不,我不回答。由于我的脚本状态
函数的输出没有优化
这一事实,我不能确定这是真的(脚本可能有一些错误的逻辑,而且现在最常推荐的方法是模块模式,对于许多任务,这提示我这些语句有问题,例如,AngularJS几乎不可能完全不优化地运行等。)这就是为什么我要征求更有经验的人的建议。谢谢,但我不能理解第一句话。我是否应该阅读它,因为V8的优化编译器是基于函数的,所以它能够优化任何不影响任何其他函数的函数,包括包含此不可优化函数声明的函数。@user907860让我重新表述一下。V8的优化编译器会逐个函数编译代码。如果它不能编译函数(例如调用
foo
)-这仅适用于该函数和该函数。如果
foo
实际上包含在函数
bar
-
bar
中,则仍可使用优化编译器编译,除非它本身包含错误的构造。