# Zettelkasten 性能基准测试报告

> 环境: Node v22.22.2, Linux x64, SQLite `:memory:`
> 日期: 2026-05-12

## 测试方法

- 批量生成笔记、链接、统计信息
- 使用内存数据库排除磁盘 I/O 变量
- 测量核心查询操作的耗时

## 结果汇总

| 规模 | 笔记数 | 链接数 | 插入耗时 | 搜索耗时 | 发光度重算 | 知识图谱 | 热力图 |
|------|--------|--------|----------|----------|------------|----------|--------|
| 1K   | 1,000  | 3,000  | 47ms     | 2.8ms    | 161ms      | 3.8ms    | 5.7ms  |
| 5K   | 5,000  | 15,000 | 150ms    | 1.8ms    | 521ms      | 3.8ms    | 14.9ms |
| 10K  | 10,000 | 30,000 | 344ms    | 1.9ms    | 1,013ms    | 5.5ms    | 30.0ms |

## 详细数据 (10K 规模)

| 操作 | 耗时 | 结果 |
|------|------|------|
| 插入笔记 | 121.5ms | 82,283 notes/sec |
| 插入链接 | 168.3ms | 30,000 links |
| 插入统计 | 53.9ms | 10,000 stats |
| FTS 搜索（单条） | 7.5ms | 1 result |
| FTS 搜索（ broad） | 1.9ms | 50 results |
| 单条读取 | 0.08ms | 带链接和标签 |
| 反向链接 | 0.12ms | 3 links |
| 发光度重计算 | 1,013ms | 10,000 notes |
| 发光度排行 | 0.22ms | Top 20 |
| 僵尸检测 | 0.07ms | 0 found |
| 最短路径 | 0.20ms | 2 hops |
| 知识热力图 | 30.0ms | Full stats |
| 知识图谱 | 5.5ms | 100 nodes, 72 edges |
| 自动归档（dryRun） | 1,002ms | 0 candidates |

## 性能阈值检查

| 阈值 | 10K 实测 | 状态 |
|------|----------|------|
| 搜索 < 100ms | 1.9ms | ✅ |
| 单条读取 < 10ms | 0.08ms | ✅ |
| 发光度重算 < 5000ms | 1,013ms | ✅ |
| 排行查询 < 50ms | 0.22ms | ✅ |
| 热力图 < 200ms | 30.0ms | ✅ |
| 知识图谱 < 500ms | 5.5ms | ✅ |
| 路径查找 < 500ms | 0.20ms | ✅ |

## 关键发现

1. **FTS 搜索性能优异**：1.9ms 搜索 10K 笔记，说明 FTS5 + LIKE 双引擎合并策略效果很好
2. **单条查询极快**：0.08ms，完全满足交互式使用
3. **发光度重计算是主要耗时点**：O(n) 遍历，10K 约 1s。建议：
   - 不要频繁全量重算，改为增量更新
   - 或者异步后台任务执行
4. **自动归档同样耗时**：因为它内部调用 `recalculateAll()`
5. **图算法性能优秀**：路径查找 0.2ms，知识图谱 5.5ms

## 建议

- **P0**: 为 `GlowCalculator.recalculateAll()` 添加增量更新模式，避免每次全量扫描
- **P1**: `autoArchiveZombies()` 可以接受延迟，考虑放入 cron 定时任务而非实时调用
- **P2**: 当笔记量增长到 100K 时，建议评估 `sqlite-vec` 语义搜索的补充价值

## 复现命令

```bash
npx tsx scripts/benchmark.mjs
```
