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

如何在自定义性能测试函数中正确传递待测试函数作为参数

问题原因

  • 命名冲突:你自定义的性能测试函数命名为performance,和JS内置的全局性能对象performance重名。函数作用域内查找performance.now时会优先匹配你定义的函数本身,而函数没有now方法,因此抛出报错。
  • 参数传递错误:调用性能测试函数时直接书写twoSum([2, 5, 5, 11], 10)会立即执行twoSum,把返回的数组结果传入性能测试函数,因此你在函数内打印fn得到的是执行结果而非函数本身,后续调用fn()也会报错。
  • 性能统计逻辑错误:原有代码仅执行一次待测函数就循环复用同一份时间差计算平均值,统计结果完全没有参考意义,需要将待测函数执行和时间统计放到循环内。
  • 小语法问题:twoSum内的判断语句使用了按位与&,此处应该使用逻辑与&&避免非预期的运算结果。

修复方案

第一步:修改性能测试函数文件(performance.js)

修改函数名避免命名冲突,同时修正统计逻辑:

export default function measurePerformance(fn) {
  const executions = 1_000_000
  let totalTime = 0
  for (let i = 0; i < executions; i++) {
    const t0 = performance.now()
    fn()
    const t1 = performance.now()
    totalTime += t1 - t0
  }
  return (totalTime / executions).toFixed(4)
}

注:如果是Node环境运行,需要在该文件头部引入内置性能模块:import { performance } from 'node:perf_hooks'

第二步:修改调用侧代码

调整传参方式,用箭头函数包裹带参数的待测函数调用,确保传入的是可执行的函数本身:

import measurePerformance from './performance.js'

const twoSum = (nums, target) => {
  let res = []
  for (let i = 0; i < nums.length; i++) {
    for (let j = 1; j < nums.length; j++) {
      // 修正为逻辑与
      if (nums[i] + nums[j] === target && i !== j) {
        res.push([i, j])
      }
    }
  }
  return res[0]
}

// 传入箭头函数,避免立即执行twoSum
console.log(measurePerformance(() => twoSum([2, 5, 5, 11], 10)))

内容的提问来源于stack exchange,提问作者Tyler Morales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:54:05