performance.now()是浏览器高精度计时api,返回微秒级浮点数,单调递增且不受系统时间调整影响,适合函数性能对比;node.js中推荐process.hrtime.bigint()实现纳秒级测量。

直接用高精度计时 + 多轮重复调用,就能客观对比手写函数声明和箭头函数的实际耗时差异。关键不是单次执行,而是消除随机波动、聚焦稳定性能表现。
选对计时工具,避开系统误差
浏览器环境优先用 performance.now(),它返回毫秒级浮点数,精度达微秒,不受系统时间调整影响;Node.js 环境可用 process.hrtime.bigint() 或 performance.now()(启用 --experimental-performance)。避免用 Date.now() 或 console.time(),前者精度低,后者含格式化开销。
- 浏览器中:const start = performance.now(); fn(); const end = performance.now();
- Node.js 中(推荐):const start = process.hrtime.bigint(); fn(); const end = process.hrtime.bigint(); const ns = end - start;
- 统一换算为毫秒:Number(ns / 1000000n).toFixed(3)
构造公平的测试场景
两类函数必须处理完全相同的逻辑、输入和上下文,否则比较无意义。尤其注意闭包变量的捕获方式是否一致:
- 若测试带外部变量的回调(如 array_map),确保传统函数用 use($var) 显式绑定,箭头函数靠自动捕获——这是真实使用场景,不是“作弊”
- 禁用 JIT 预热干扰:首次运行不计入,先预热 1000 次再正式测
- 输入数据量要足够大(如 10 万次循环),让毫秒级差异可测量;太小会被噪声淹没
- 每次测试前清空 CPU 缓存影响(简单做法:在两组测试间加 5ms setTimeout 或 Math.random() 循环扰动)
跑多轮取中位数,拒绝单次偶然值
单次结果受 GC、后台任务、CPU 调频等干扰极大。标准做法是:
- 连续执行 30 轮完整测试(每轮调用 10 万次目标函数)
- 记录每轮总耗时(单位:ms)
- 剔除最高、最低各 3 个值,取剩余 24 个的中位数作为最终结果
- 对比时看差值是否稳定大于 5% —— 小于该阈值通常认为无实际差异
关注真实瓶颈,不止看平均值
平均耗时只是起点。用 Chrome DevTools 的 Performance 面板或 Node.js 的 --prof 生成火焰图,观察:
- 函数调用栈深度是否不同(箭头函数省去 this 绑定,栈更浅)
- 内存分配次数(传统闭包 use 会复制变量引用,箭头函数复用外层词法环境)
- 是否触发隐藏类变更(影响 V8 优化)—— 箭头函数因无 arguments 和 prototype,更易被内联











