停止猜测你的应用为何慢:实用的 Big O 符号指南

发布: (2026年3月25日 GMT+8 00:56)
3 分钟阅读
原文: Dev.to

Source: Dev.to

为什么 Big O 很重要

当我们开始写代码时,主要目标往往只是让功能能跑起来。功能上线、bug 被修复后,我们就感到满意。但随着用户数量的增长和数据集的膨胀,简单的操作——比如遍历数组——就可能导致浏览器卡死。

Big O 是一种描述代码性能随输入规模增长而变化的方式。它回答了这样的问题:如果我的输入变大 10 倍,应用会慢多少?


空间‑时间权衡

大多数情况下,让算法更快(更好的 时间复杂度)需要使用更多内存(更高的 空间复杂度)来存放临时数据,例如查找表。在内存受限的设备上(比如老旧的手机),你可能会刻意选择较慢的算法,以避免因内存不足而崩溃。优化始终要结合具体情境。


二次方 vs. 线性:使用 Set

设想一个车场管理系统(YMS)用于跟踪卡车车牌。你有:

  • arriving – 刚到达的卡车车牌
  • registered – 已经存入数据库的车牌

你需要找出哪些到达的卡车已经在系统中注册。

暴力搜索 (O(n²))

function findRegisteredTrucks(arriving: string[], registered: string[]): string[] {
  const matches: string[] = [];

  for (let i = 0; i = {};

使用 Set 的优化版 (O(n))

function findRegisteredTrucksOptimized(arriving: string[], registered: string[]): string[] {
  const registeredSet = new Set(registered);
  return arriving.filter(plate => registeredSet.has(plate));
}

排序本质上比单纯的遍历更复杂,但 O(n log n) 已是基于比较的排序算法的最佳标准时间。


要点回顾

  • 注意循环 —— 在大数据集上避免嵌套循环。
  • 利用 SetMap 实现 O(1) 查找。
  • 缓存结果(记忆化)在需要重复计算时非常有用。
  • 记住 空间‑时间权衡:更快的算法往往需要更多内存。

你曾经解决过的最糟糕的性能瓶颈是什么?在评论区分享你的故事吧! 👇

0 浏览
Back to Blog

相关文章

阅读更多 »

网络怀旧

概述 我一直对互联网的快速演变感到着迷。从90年代那种杂乱、色彩斑斓的网站,到今天的简洁、极简设计——它……