如何在自定义性能测试函数中正确传递待测试函数作为参数
问题原因
- 命名冲突:你自定义的性能测试函数命名为
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
相关产品推荐
相关产品推荐

