性能与优化
本指南帮助你了解 wescode 的性能特性,并在大型项目中获得最佳体验。
CKG 索引性能
索引时间基准
CKG 索引性能主要取决于项目中的源代码文件数量和总行数:
| 项目规模 | 文件数 | 首次索引时间 | 增量更新时间 |
|---|---|---|---|
| 小型(<1 万行) | ~50 | 2-5 秒 | <100ms |
| 中型(1-10 万行) | ~500 | 10-30 秒 | 100-300ms |
| 大型(10-50 万行) | ~2000 | 1-3 分钟 | 200-500ms |
| 超大型(>50 万行) | >5000 | 3-10 分钟 | 500ms-1s |
索引排除配置
对于大型项目,排除不需要索引的目录可以显著提升性能:
// .vscode/settings.json
{
"wescode.ckg.exclude": [
"vendor/**",
"node_modules/**",
"dist/**",
"build/**",
"*.min.js",
"*.generated.go",
"*.pb.go",
"testdata/**",
".git/**"
]
}
索引数据存储
CKG 索引数据存储在 SQLite 数据库中:
$WESCODE_DATA_DIR/cells/ws-{hash}/index/code.db
索引数据会随工作区自动管理,删除后会在下次打开时自动重建。
增量索引
文件修改后 CKG 会进行增量索引,只重新分析受影响的文件:
- 保存文件后自动触发
- 增量索引在后台执行,不阻塞编辑器
- 仅受影响的符号和边会更新
大型项目优化
内存使用
wescode 的内存使用主要来自以下部分:
| 组件 | 典型内存 | 说明 |
|---|---|---|
| 编辑器渲染 | 200-400 MB | VSCode 基座 |
| CKG 索引 | 50-200 MB | 取决于项目规模 |
| AI 上下文缓存 | 20-50 MB | 对话历史和上下文 |
| Buffer Overlay | 5-20 MB | 编辑器内存同步 |
| tree-sitter 解析器 | 10-30 MB | 语法解析 |
优化建议
1. 合理设置排除规则
确保 wescode.ckg.exclude 排除了所有不需要索引的目录:
{
"wescode.ckg.exclude": [
"vendor/**",
"node_modules/**",
"*.pb.go",
"*.generated.*"
]
}
2. 限制工作区大小
如果项目是 monorepo,考虑只打开你正在工作的子目录,而不是整个仓库根目录。
3. 关闭不需要的功能
如果你的项目很大且不需要某些功能:
{
// 关闭 Ghost Write(减少后台 API 调用)
"wescode.ghostWrite.enabled": false,
// 降低 CKG 索引频率
"wescode.ckg.incrementalDebounceMs": 2000,
// 限制调用图的最大深度
"wescode.ckg.maxCallDepth": 5
}
4. 使用轻量级模型
对于日常补全和简单问答,使用轻量级模型可以减少等待时间:
{
"wescode.ghostWrite.model": "claude-haiku",
"wescode.chat.defaultModel": "claude-sonnet"
}
上下文窗口管理
什么是上下文窗口?
上下文窗口是 LLM 单次请求能处理的最大 Token 数量。wescode 会自动管理上下文窗口,确保在限制内提供最相关的信息。
上下文组装
wescode 的上下文组装引擎按优先级注入信息:
上下文窗口(示例:128K tokens)
├── 系统提示词 (~2K)
├── 技能(Skills)(~3K)
├── 项目指令(AGENTS.md)(~1K)
├── 记忆召回 (~2K)
├── CKG 片段 (~5K)
├── 当前文件内容 (~10K)
├── 引用的上下文文件 (~20K)
├── 对话历史 (动态)
└── 用户消息
长对话处理
当对话历史超过上下文窗口限制时,wescode 使用认知结算(CognitiveSettlement)机制:
- MidRunHandoff:Run 进行中的上下文压缩
- EndOfRunSettlement:Run 结束时生成 SessionState 摘要
- 机械压缩 Fallback:确定性的 Token 削减(保留工具证据)
这确保了关键信息不会丢失,同时保持在上下文窗口限制内。
优化上下文使用
1. 精确引用
使用 @file 和 @symbol 精确引用相关代码,而不是让 AI 自己搜索:
# 好:精确引用
@internal/auth/jwt.go 这个文件的 ValidateToken 函数有什么问题?
# 差:需要 AI 搜索
项目中的 JWT 验证有什么问题?
2. 分步对话
对于复杂任务,分步进行比一次性提出更有效:
# 第一步
@internal/auth/ 分析这个包的认证流程
# 第二步(基于上一步的结果)
重构 ValidateToken 函数,添加 Token 刷新逻辑
# 第三步
为重构后的代码编写测试
3. 新建会话
如果对话变得很长且偏离了原始话题,建议新建一个会话。这样可以重置上下文,获得更准确的回复。
Token 用量控制
查看 Token 用量
在状态栏可以查看当前会话的 Token 消耗。详细的 Token 用量统计在「记忆中心 → Token 统计」页面。
统计维度
Token 统计支持以下维度:
| 维度 | 说明 |
|---|---|
| 按模型 | 每个模型的 Token 消耗 |
| 按 Agent | 每个 Agent 的消耗 |
| 按会话 | 每个会话的消耗 |
| 按天 | 每日消耗趋势 |
控制 Token 消耗的技巧
- 使用合适的模型:简单任务用 Haiku,复杂任务用 Opus
- 精确引用上下文:避免引用不相关的文件
- 及时新建会话:长对话会累积大量上下文 Token
- 使用 Inline Command:单轮操作比多轮对话更省 Token
- 限制 Agent 迭代次数:通过设置
maxIterations避免无限循环
配额配置
{
"wescode.quotas.tokensPerMinute": 100000,
"wescode.quotas.tokensPerDay": 5000000,
"wescode.quotas.maxConcurrentRuns": 1
}
离线能力
不需要网络的功能
以下功能在没有网络连接时仍然可用:
| 功能 | 离线可用 | 说明 |
|---|---|---|
| 编辑器核心功能 | ✅ | 代码编辑、文件管理 |
| CKG 索引 | ✅ | 本地索引和查询 |
| 调用图 | ✅ | 基于本地索引 |
| 影响分析 | ✅ | 基于本地索引 |
| 代码搜索 | ✅ | 本地文件搜索 |
| 语法高亮 | ✅ | tree-sitter 本地解析 |
| Ghost Write | ❌ | 需要 LLM API |
| Chat 对话 | ❌ | 需要 LLM API |
| Inline Command | ❌ | 需要 LLM API |
本地模型
使用 Ollama 或其他本地模型服务,可以实现完全离线的 AI 功能:
# config.yaml
providers:
- name: ollama-local
type: ollama
base_url: http://localhost:11434
models:
- name: codellama
context_window: 16384
配置本地模型后,即使没有互联网,也可以使用 Chat 和 Inline Command 等 AI 功能。
缓存策略
wescode 会缓存以下数据以提升离线体验:
- CKG 索引(持久化到 SQLite)
- 会话历史(持久化到 Cell 数据库)
- 记忆数据(持久化到 Cell 数据库)
- 技能文件(本地文件系统)
性能诊断
查看性能指标
在命令面板中执行 wescode: Show Performance Stats 查看:
- CKG 索引状态和大小
- 内存使用情况
- 最近 API 调用的响应时间
- 活跃的后台任务
日志文件
wescode 的日志文件位于:
$WESCODE_DATA_DIR/logs/wescode.log
日志包含 CKG 索引时间、API 调用时间、工具执行时间等性能数据。
重建索引
如果 CKG 索引出现问题(查询结果不准确、索引异常大):
- 命令面板 →
CKG: Rebuild Index - 或删除
cells/ws-{hash}/index/目录后重新打开工作区