V8은 객체에 Hidden Class를 붙여서, 객체 구조를 빠르게 파악하고 IC를 최적화함.
function makeUser(name) {
const user = {};
user.name = name;
user.age = 30; // → 여기가 나중에 추가되면 Hidden Class 변화
return user;
}
function makeUser(name) {
const user = { name: name, age: 30 }; // → 한 번에 정의, Hidden Class 고정
return user;
}
function print(obj) {
console.log(obj.value);
}
print({ value: 1 }); // 첫 호출: Monomorphic IC
print({ value: "hello" }); // 타입은 같지만 구조가 다름 → Polymorphic IC
print({ val: 1 }); // 다른 프로퍼티 이름 → Megamorphic fallback
###💡 팁
예: 타입이 섞이는 연산
function sum(x, y) {
return x + y;
}
function sum(x, y) {
if (typeof x === 'number' && typeof y === 'number') {
return x + y;
}
return String(x) + String(y);
}
→ 타입 guard를 넣어서 Hot Path를 분리, Speculative Optimizer가 안전하게 최적화 가능
const arr = [1, 2, 3];
arr[100] = 4; // → Hole 발생 → 배열 전체가 Dictionary elements로 변경
%PrepareFunctionForOptimization(myFunc);
%OptimizeFunctionOnNextCall(myFunc);
myFunc(); // 최적화됨
%GetOptimizationStatus(myFunc);
// 1 = optimized, 2 = not optimized, 4 = always optimized, etc.
💡 실전에서는 Node.js 실행 시 --allow-natives-syntax와 함께 사용
플래그 | 설명 |
---|---|
--trace-opt | 최적화된 함수 로그 출력 |
--trace-deopt | Deopt 발생 시점 로그 출력 |
--print-bytecode | Ignition 바이트코드 보기 |
--trace-inlining | 함수 인라이닝 로그 출력 |
🚨 특히 Deopt 로그는 성능 저하의 “실시간 경고등” 역할
console.time("sum");
for (let i = 0; i < 1e6; i++) sum(1, 2);
console.timeEnd("sum");
필요하면: