You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:02