性能与优化

本指南帮助你了解 wescode 的性能特性,并在大型项目中获得最佳体验。


CKG 索引性能

索引时间基准

CKG 索引性能主要取决于项目中的源代码文件数量和总行数:

项目规模文件数首次索引时间增量更新时间
小型(<1 万行)~502-5 秒<100ms
中型(1-10 万行)~50010-30 秒100-300ms
大型(10-50 万行)~20001-3 分钟200-500ms
超大型(>50 万行)>50003-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 MBVSCode 基座
CKG 索引50-200 MB取决于项目规模
AI 上下文缓存20-50 MB对话历史和上下文
Buffer Overlay5-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)机制:

  1. MidRunHandoff:Run 进行中的上下文压缩
  2. EndOfRunSettlement:Run 结束时生成 SessionState 摘要
  3. 机械压缩 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 消耗的技巧

  1. 使用合适的模型:简单任务用 Haiku,复杂任务用 Opus
  2. 精确引用上下文:避免引用不相关的文件
  3. 及时新建会话:长对话会累积大量上下文 Token
  4. 使用 Inline Command:单轮操作比多轮对话更省 Token
  5. 限制 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 会缓存以下数据以提升离线体验:


性能诊断

查看性能指标

在命令面板中执行 wescode: Show Performance Stats 查看:

日志文件

wescode 的日志文件位于:

$WESCODE_DATA_DIR/logs/wescode.log

日志包含 CKG 索引时间、API 调用时间、工具执行时间等性能数据。

重建索引

如果 CKG 索引出现问题(查询结果不准确、索引异常大):

  1. 命令面板 → CKG: Rebuild Index
  2. 或删除 cells/ws-{hash}/index/ 目录后重新打开工作区

相关文档