我看到一個關於v8 Optimization的問題,這導致我在v8優化中玩了一下。 我也見過bluebird post about v8 Optimization killers。優化/函數運行時v8狀態碼會發生什麼變化?
據V8回購,優化狀態代碼是在2乘法: 1,2,4,8等等(見OptimizationStatus枚舉)
但是,下面的代碼給了我奇怪的狀態代碼像17和65,只有在這些特定情況下(請參閱最後幾行代碼)。 有關爲什麼會發生這種情況的任何想法?
function adder(a, b) {
return new Function('a', 'b', 'return b%2 ? a + b : b%3 ? a - b : b%5 ? b/a : a * b')(a, b);
}
function addereval(a, b) {
return eval('b%2 ? a + b : b%3 ? a - b : b%5 ? b/a : a * b');
}
function printStatus(fn) {
var status = %GetOptimizationStatus(fn)
switch (status) {
case 1: console.log(fn.name, "function is optimized"); break;
case 2: console.log(fn.name, "function is not optimized"); break;
case 3: console.log(fn.name, "function is always optimized"); break;
case 4: console.log(fn.name, "function is never optimized"); break;
case 6: console.log(fn.name, "function is maybe deoptimized"); break;
case 7: console.log(fn.name,"Function is optimized by TurboFan"); break;
default: console.log(fn.name, "Unknown optimization status: ", status); break;
}
}
printStatus(adder);
printStatus(addereval);
for(let i = 0; i < 263; i++) {
adder(1, 2);
}
console.log('\n', '==== adder after invocation - result is on node v8.2.1 17 or 65 on node v8.7.0 ===');
printStatus(adder);
addereval(1, 2);
console.log('\n', '==== addereval after invocation - result is 65 ===');
printStatus(addereval);
運行該代碼:
node --trace_deopt --allow-natives-syntax FILENAME.js
您可以使用my gist,如果你發現它更舒適
它們是位域,由多個標誌組成。你所描述的「狀態代碼」是訪問返回值中個別標誌的掩碼。 – Bergi
另外,請注意,「優化殺手」文件已過時,因爲它談到了已經退役的「曲軸」編譯器。從Chrome M59/Node.js 8.3開始,V8使用「Turbofan」,它可以優化一切。(有些構造總是比其他構造慢,但是Turbofan的設計永遠不會因爲任何原因拒絕優化整個函數。) – jmrk