Skip to content

perf(tui): 埋め込みターミナルの描画ホットパスを最適化する (#65)#234

Merged
kkyosuke merged 2 commits into
mainfrom
issue-065
Jun 21, 2026
Merged

perf(tui): 埋め込みターミナルの描画ホットパスを最適化する (#65)#234
kkyosuke merged 2 commits into
mainfrom
issue-065

Conversation

@kkyosuke

Copy link
Copy Markdown
Owner

目的

コードレビュー (#65) で判明した、エージェント高頻度出力時の CPU 消費・応答性に直結する描画ホットパス 3 件を解消する。観測される描画結果は従来どおりのまま、変化がない限り重い処理(パーサーロック・全グリッド文字列化・TIOCSWINSZ ioctl)を行わないようにする。

変更内容

① 高頻度出力時の再描画コアレス(terminal_pane.rs

  • reader スレッドは 8KiB チャンクごとに generation を上げる(≒4ms 間隔)ため、没入 drive が毎回フル再描画していた。
  • dirty を 対話起因(入力エコー・resize・スクロール・選択・hover・badge)と出力起因(generation 変化)に分離。
  • 出力起因のみのフレームは 最小フレーム間隔 MIN_FRAME=16ms(≒60fps) でコアレス。対話起因は即時描画で応答性を維持。
  • waitredraw_deadline を渡し、保留出力をデッドラインまで持ち越して busy-loop を回避(入力は常に即時)。

② リンク全走査のキャッシュ(terminal_view.rs + drive

  • 描画のたびに link_cells(screen) が全論理行を平坦化し HashSet<Cell> を再構築していた。
  • TerminalView::from_screen_with_links を追加し、precomputed links を受け取れるようにした(既存 from_screen_with_selectionlink_cells を呼んでこれに委譲、既存経路・テスト・snapshot は無改変)。
  • drive 側で links を generation でキャッシュ。画面内容が変わらない限り再検出せず、ホバーのみのフレームは再走査しない。

③ Switch プレビューの差分化(terminal_pool.rs

  • snapshot が毎反復で無条件に session.resizefrom_screen を実行していた。
  • preview_cache(dir / geo / generation / view)を追加。3 つすべて一致ならキャッシュした view を返却(パーサーロックすら取らない)。dir/geo 変化時のみ resize、generation 変化時のみ from_screen。没入 drivelast_geo 差分化と同等の挙動に揃えた。

テスト・確認方法

  • cargo fmt / cargo clippy --all-targets -- -D warnings / cargo test(1376 passed)。
  • カバレッジ: lines / functions ともに 100%(terminal_pane.rs / terminal_pool.rs は端末 I/O のためカバレッジ除外。terminal_view.rs の新メソッドには単体テストを追加)。
  • 描画結果は従来どおり(既存 ui / e2e テスト維持)。

🤖 Generated with Claude Code

test and others added 2 commits June 20, 2026 22:28
エージェント高頻度出力時に CPU を恒常消費していた 3 つの描画ホット
パスを差分化・コアレス・キャッシュで削減する。

- 没入 drive: 出力起因の再描画を最小フレーム間隔 (16ms) でコアレス。
  対話起因 (入力エコー・resize・選択・hover・badge) は即時描画を維持。
  wait に再描画デッドラインを渡し busy-loop を避ける。
- リンク全走査: link_cells の結果を generation でキャッシュし、画面
  内容が変わらない限り再検出しない。TerminalView に precomputed links
  を受け取る from_screen_with_links を追加 (既存経路は委譲で無改変)。
- Switch プレビュー: pool.snapshot に dir/geo/generation のキャッシュ
  を持たせ、未変化なら resize ioctl も from_screen も行わず再利用する。

描画結果は従来どおり。terminal_pane/terminal_pool はカバレッジ除外、
terminal_view の新メソッドは単体テストを追加。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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 9590ce1 into main Jun 21, 2026
4 checks passed
@kkyosuke kkyosuke deleted the issue-065 branch June 21, 2026 00:52
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