Skip to content

perf(tui): 描画フレーム構築の毎回ヒープ確保を削減する#267

Merged
kkyosuke merged 1 commit into
mainfrom
perf/frame-build
Jun 21, 2026
Merged

perf(tui): 描画フレーム構築の毎回ヒープ確保を削減する#267
kkyosuke merged 1 commit into
mainfrom
perf/frame-build

Conversation

@kkyosuke

Copy link
Copy Markdown
Owner

目的

ホーム画面の毎描画(ライブセッション在席時は約 9fps で定常的に発生)で起きていた、フレームバッファの無駄なヒープ確保を削減する。描画結果・出力バイト列は不変の純粋な内部最適化。

変更内容

FramePainter::flushscreen.rs

  • 毎フラッシュで self.base.clone() により全画面 Vec<String> を新規確保していた。
  • 使い回すスクラッチバッファへ clone_from(行 String のアロケーションを再利用)してオーバーレイを合成し、描画後に prevswap する方式に変更。prev は diff のベースとして無傷のまま使える。
  • 定常的な再描画でフレームバッファのヒープ確保がゼロになる。

render_frame ボディ行合成(home/ui/mod.rs

  • 左右ペインを borrow して 1 行ごとに .cloned() を 2 回 + format! で新規 String を確保していた。
  • left / right はこのループ以降で読まれないため into_iter で消費し、パディング済み左セルの String に push_str する方式に変更(1 行あたり clone 2 回と format! の確保を削減)。

テスト・確認方法

  • cargo fmt / cargo clippy --all-targets -- -D warnings / cargo test(1463+ 件)すべてパス。
  • pre-commit の coverage フック通過(カバレッジ 100% 維持 — 分岐は追加していない)。
  • 既存の diff_frame / FramePainter テストが出力不変を担保。

🤖 Generated with Claude Code

ホーム画面の毎描画で発生していた無駄なアロケーションを 2 か所削る。

- FramePainter::flush が毎フラッシュで base フレーム全体を clone していたのを、
  使い回すスクラッチバッファへ clone_from して描画後に prev と swap する方式に変更。
  定常的な再描画でフレームバッファのヒープ確保がゼロになる。
- render_frame のボディ行合成で、左右ペインを borrow して 1 行ごとに 2 回 clone し
  format! で新規 String を確保していたのを、所有 Vec を into_iter で消費して
  パディング済み左セルへ push_str する方式に変更。

いずれも出力バイト列・挙動は不変。

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 93e6832 into main Jun 21, 2026
3 checks passed
@kkyosuke kkyosuke deleted the perf/frame-build branch June 21, 2026 20:57
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