Files
NeoBot/docs/core-concepts/performance.md
K2cr2O1 24af862924 feat: 添加性能优化和架构文档,更新依赖和核心模块
refactor(browser_manager): 实现页面池机制以提升性能
refactor(image_manager): 添加模板缓存并集成页面池
refactor(bili_parser): 迁移到异步HTTP请求并实现会话复用
docs: 新增性能优化、架构设计和最佳实践文档
chore: 更新requirements.txt添加新依赖
2026-01-13 03:56:31 +08:00

74 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 性能优化详解
NEO Bot 能跑这么快,不是因为运气好,是因为我们做了大量微小的优化工作。这里详细拆解每一个性能黑科技。
## 1. Playwright 页面池 (Page Pool)
### 痛点
传统的 Bot 发图流程:
1. 用户发指令。
2. Bot 启动浏览器 (耗时 500ms+)。
3. 创建新页面 (耗时 100ms+)。
4. 渲染,截图。
5. 关闭浏览器。
这种模式下,发一张图至少要等 1 秒以上,并发高了直接卡死。
### 解决方案
`BrowserManager` 维护了一个**页面池**。
* **启动时**: 自动预热 3 个页面(可配置),挂在后台待命。
* **运行时**: 需要截图时,直接从池里 `get_page()`,耗时 **0ms**
* **结束后**: 截图完成,页面执行 `about:blank` 洗白,然后 `release_page()` 放回池里。
### 收益
图片生成响应时间从 **1.5s** 降低到 **0.2s** (仅渲染耗时)。
## 2. Jinja2 模板缓存
### 痛点
每次渲染 HTML都要从硬盘读文件然后解析模板语法。硬盘 IO 是慢的,解析也是慢的。
### 解决方案
`ImageManager` 引入了内存缓存 `_template_cache`
* 第一次读取模板后,编译好的 `Template` 对象直接存入字典。
* 后续请求直接从内存拿对象渲染。
### 收益
模板加载时间归零。
## 3. 全局 HTTP 连接复用
### 痛点
插件(如 B站解析每次请求 API 都创建一个新的 `aiohttp.ClientSession`
这意味着每次都要进行DNS 解析 -> TCP 握手 -> SSL 握手。这在 HTTPS 下非常慢。
### 解决方案
我们在插件层面实现了 `get_session()`
* 全局共享一个 `ClientSession`
* 复用底层的 TCP 连接 (Keep-Alive)。
### 收益
API 请求延迟降低 50% 以上,大幅减少服务器 TCP 连接数。
## 4. orjson 极速序列化
### 痛点
Python 自带的 `json` 库性能平平,特别是在处理 OneBot 这种大量 JSON 通信的场景下。
### 解决方案
我们全面替换为 `orjson`
* Rust 编写,速度是标准库的 10 倍以上。
* 支持直接返回 `bytes`,减少内存复制。
## 5. Mypyc 编译
### 痛点
Python 是解释型语言,执行效率天生低。
### 解决方案
利用 `setup_mypyc.py` 将核心模块编译为 C 扩展。
* `core/ws.py`: WebSocket 消息处理循环。
* `core/managers/*.py`: 事件分发逻辑。
这些高频调用的代码变成了机器码,执行效率直逼 C++。