停止猜测你的应用为何慢:实用的 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) 已是基于比较的排序算法的最佳标准时间。
要点回顾
- 注意循环 —— 在大数据集上避免嵌套循环。
- 利用
Set和Map实现 O(1) 查找。 - 缓存结果(记忆化)在需要重复计算时非常有用。
- 记住 空间‑时间权衡:更快的算法往往需要更多内存。
你曾经解决过的最糟糕的性能瓶颈是什么?在评论区分享你的故事吧! 👇