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

JS经典斐波那契挑战两种解法的运行速度差异疑问

问题解答

1 JavaScript数组length属性的读取规则

JavaScript中数组的length是引擎自动维护的预存属性,不需要遍历整个数组统计元素数量,读取操作的时间复杂度为O(1)。
所有数组元素增删操作(如push、pop、splice等)执行时,JS引擎会自动同步更新length的存储值,直接读取时拿到的就是已经计算完成的结果,没有额外计算开销。

2 解法A与解法B的性能对比

两种解法的时间复杂度均为O(n),实际运行速度差异极小,常规场景下完全无法感知:

  • 你担心的解法B中fibArr.push(fibArr[fibArr.length - 1] + fibArr[fibArr.length - 2])这行代码没有额外性能损耗,length读取的效率和解法A中直接用索引fiboArray[i-1]读取的效率基本一致。
  • 解法B开头多了3次边界判断,当输入n≤2时会直接返回结果,反而比解法A少执行循环,速度更快。
  • 当输入n远大于2时,解法A因为不需要在循环内读取length属性(虽然开销极低),也没有前置的分支判断开销,运行速度会有极微小的优势,但这个差异在绝大多数使用场景下都可以忽略。

解法A代码

function fib(n) {
  const fiboArray = [0,1]
  for(let i=2; i <= n; i++) {
    fiboArray.push(fiboArray[i-2] + fiboArray[i-1])
  }
  return fiboArray[n]
}
console.log(fib(5))

解法B代码

function fib(n) {
  const fibArr = [0, 1, 1]
  
  if(n == 0) {
    return 0
  }
  if(n == 1 || n == 2) {
    return 1
  }
  if (n > 2) {
    for (let i = 3; i <= n; i++) {
      fibArr.push(fibArr[fibArr.length - 1] + fibArr[fibArr.length - 2])
    }
  }
  return fibArr[fibArr.length - 1]
}
console.log(fib(9))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:57:03