TS递归代码基准测试耗时差异异常问题求助
问题
对TypeScript递归代码进行基准测试时,发现同一代码首次测试耗时远高于后续测试,理论上耗时应一致。使用ts-node运行代码,测试代码如下:
export function benchmark(callback: CallableFunction, prefix: string) { const startStr = `${prefix}-start`; const endStr = `${prefix}-end`; performance.mark(startStr); callback(); performance.mark(endStr); console.log(performance.measure(prefix, startStr, endStr)); } function frecurive(n: number): number { if(n === 0) { return 0; } if(n === 1) { return 1; } return frecurive(n-1) + frecurive(n-2); } function main() { benchmark(() => { frecurive(7); }, "all-inline"); benchmark(() => { frecurive(7); }, "declarative"); benchmark(() => { frecurive(7); }, "half-inline"); } main();
测试结果截图:
请问该异常情况的原因是什么?
原因分析
- V8引擎的JIT编译优化:首次执行
frecurive函数时,Node.js/ts-node底层的V8引擎只会以解释执行的方式运行代码,不会做性能优化。当函数被多次调用后,V8会判定这是高频调用的热点函数,触发即时编译(JIT),将其转换为高效的机器码,后续执行速度自然大幅提升。 - 函数初始化开销:ts-node处理TypeScript代码时,首次调用函数会包含类型检查、TS转JS后的函数初始化等额外操作;后续调用时这些初始化步骤已完成,无需重复执行,耗时自然降低。
- 缓存复用:V8引擎会缓存已编译的函数代码,以及递归过程中重复计算的节点结果,后续调用时直接复用缓存内容,减少了重复计算和编译的开销。
内容的提问来源于stack exchange,提问作者steven-lie
相关产品推荐
相关产品推荐

