function sum(x, y) {
return x + y;
}
%PrepareFunctionForOptimization(sum);
sum(1, 2); // warm-up
%OptimizeFunctionOnNextCall(sum);
sum(1, 2); // optimized
sum("a", 1); // triggers deopt
node --allow-natives-syntax --trace-opt --trace-deopt test.js
#### 🔍 로그 해석
bash
복사
편집
[optimizing 0x12345678 <JSFunction sum (sfi = 0x...)> - took 0.23, ...
[deoptimizing (DEOPT eager): begin 0x12345678 sum @ 0]
; reason: wrong type
; deopted at <unknown>:1:10
; source position: 15
[deoptimizing: end 0x12345678 sum @ 0 => node=3, pc=0x..., caller=0x...]
function parseData(str) {
return JSON.parse(str);
}
node --trace-opt --trace-deopt parser.js
[deoptimizing (<DEOPT eager): reason: wrong value (undefined)]
function parseData(str) {
if (typeof str !== 'string') return null;
return JSON.parse(str);
}
Deopt 방지 → TurboFan이 더 aggressive하게 최적화 가능
결과: 처리 속도 2~3배 향상
function getIP(log) {
return log.meta && log.meta.ip;
}
log.meta가 없는 경우 많았고, Optional chaining 사용 불가한 구식 환경
reason: unstable map
log.meta의 구조가 매번 다름 → Hidden Class/IC 깨짐
function getIP(log) {
const meta = log.meta || {};
return typeof meta.ip === 'string' ? meta.ip : null;
}
안정적인 객체 구조 확보 → IC 안정화 → 성능 30% 향상
arr.sort((a, b) => {
if (a.score > b.score) return -1;
if (a.score < b.score) return 1;
return 0;
});
function compareScores(a, b) {
return b.score - a.score;
}
arr.sort(compareScores);
항목 | 확인 |
---|---|
객체 구조 일관성 유지 | ✅ |
타입 고정 및 가드 사용 | ✅ |
Hot path 분리 | ✅ |
반복되는 로직은 함수 분리 (인라이닝 유도) | ✅ |
배열은 Packed 상태 유지 | ✅ |
arguments 대신 ...args | ✅ |
실전 테스트 전 warm-up → optimize → 측정 | ✅ |