J'ai vu une question à propos de v8 Optimization qui m'a amené à jouer un peu avec l'optimisation v8. J'ai également vu bluebird post à propos de v8 Optimization killers.Qu'arrive-t-il au code d'état v8 lors de l'exécution de l'optimisation/de la fonction?
Selon repo v8, codes d'état d'optimisation sont en multiplications de 2: 1,2,4, 8 et ainsi de suite (voir OptimizationStatus ENUM)
Cependant, le code suivant m'a donné des codes d'état étranges comme 17 et 65, et seulement dans ces cas spécifiques (voir les dernières lignes de code). Des idées sur pourquoi cela se passe-t-il?
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);
Exécutez ce code avec:
node --trace_deopt --allow-natives-syntax FILENAME.js
Vous pouvez utiliser my gist si vous trouvez plus confortable
Ce sont des champs de bits composés de plusieurs drapeaux. Ce que vous décrivez comme "codes d'état" sont les masques permettant d'accéder à l'indicateur individuel dans la valeur de retour. – Bergi
Notez également que le document "Optimization Killers" est obsolète, car il parle du compilateur "Crankshaft", qui a été retiré. A partir de Chrome M59/Node.js 8.3, V8 utilise "Turbofan", qui permet d'optimiser tout.(Certaines constructions seront toujours plus lentes que d'autres, mais Turbofan a été conçu pour ne jamais refuser l'optimisation d'une fonction entière pour une raison quelconque.) – jmrk