Skip to content

perf(tui): ターミナルのリンク走査を出力フレームごとに1回へ集約#437

Merged
kkyosuke merged 1 commit into
mainfrom
perf/terminal-link-scan
Jun 27, 2026
Merged

perf(tui): ターミナルのリンク走査を出力フレームごとに1回へ集約#437
kkyosuke merged 1 commit into
mainfrom
perf/terminal-link-scan

Conversation

@kkyosuke

Copy link
Copy Markdown
Owner

目的

埋め込みターミナルでエージェントが出力をストリームしている間の、レンダリングループのホットパス(パーサロック保持区間)のCPUとロック競合を削減する。

背景(性能レビューでの指摘)

出力が変化したフレーム(世代バンプごと・MIN_FRAME=16ms にスロットリング)で、グリッド全体を独立に複数回走査していた:

  1. link::link_cells — 全論理行をフラット化し URL を検出(下線表示用のセル集合)
  2. link::pr_linksscreen_urls別途もう一度全グリッドをフラット化し url_spans を実行(PR URL 収集用)

両者はほぼ同一の作業(同じ論理行に対する url_spans)を共有せず二重実行していた。これはリーダースレッドが必要とするパーサロックを握ったまま走る最も忙しい区間。

変更内容

  • link::scan_links を追加。論理行のフラット化と url_spans 検出を1パスで行い、リンクセル(HashSet<Cell>)と URL 文字列(Vec<String>)の両方を返す ScreenLinks を生成する。スクラッチバッファの再利用は従来どおり。
  • link_cells / screen_urls をこの共通走査への委譲に置き換え。
  • pr_links_from(&[String]) を追加し、既に走査済みの URL リストから PR リンクを取り出せるようにした(pr_links も内部でこれを利用)。
  • terminal/pane.rs の描画ループを、出力変化時に scan_links を1回だけ呼び、その結果からリンクセルと PR リンクの両方を得る形へ変更。全グリッド走査が2回→1回になる。

挙動は不変。

テスト・確認方法

  • cargo fmt / cargo clippy --all-targets -- -D warnings クリーン。
  • cargo test 全 2251 件 pass(link.rs の既存ユニットテストが scan_links/pr_links_from を網羅)。
  • カバレッジ 100%(pre-commit の coverage ゲート通過)。

出力が変化したフレームで `link_cells`(下線用セル)と `pr_links`/
`screen_urls`(PR URL 収集)が、それぞれ全グリッドを走査して同じ
`url_spans` を二重に実行していた。レンダリングループがパーサのロックを
握っている最中の走査のため、リーダースレッドと競合する重い区間だった。

`link::scan_links` を追加し、論理行のフラット化と URL スパン検出を1パスに
統合してセル集合と URL 文字列の両方を返すようにした。`link_cells` /
`screen_urls` はこの共通走査へ委譲し、`pr_links_from` で既知の URL から
PR リンクを取り出せるようにして、pane の描画ループは1回の走査で両方を得る。

挙動は不変(既存テスト 2251 件が pass)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

📊 Test Coverage

🚀 いまのカバレッジ (Lines): 100.00% — この調子でいこう!

🎉✨ パーフェクト!全ファイル Lines カバレッジ 100% を達成しました 🏆🐰

@kkyosuke kkyosuke merged commit 8b75ae4 into main Jun 27, 2026
3 checks passed
@kkyosuke kkyosuke deleted the perf/terminal-link-scan branch June 27, 2026 20:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant