Skip to content

takt list のパフォーマンス改善: base commit 解決の重複排除とキャッシュ #185

@nrslib

Description

@nrslib

問題

takt list が遅い。原因は buildListItems で各ブランチごとに重い git 操作を重複実行していること。

ボトルネックの構造

buildListItems (N ブランチ)
  └── per branch:
      ├── getFilesChanged()
      │   └── resolveBranchBaseCommit()      ← 重い
      │       ├── reflog (1 cmd) → 成功すれば即 return
      │       └── resolveBranchBaseCommitFromRefs()
      │           ├── listCandidateRefs() → git for-each-ref (全 ref 列挙)
      │           └── per ref (M 個): resolveBaseCandidate() → 3 git cmds
      │
      └── getOriginalInstruction()
          └── findFirstTaktCommit()
              ├── reflog (1 cmd)             ← 同じ reflog を再計算
              └── resolveBranchBaseCommitFromRefs()  ← 同じ全 ref 走査を再計算

reflog が失敗するケース(リモートブランチ、pruned 等)では N × 2 × M × 3 git commands が実行される。

改善策

1. base commit をブランチごとに1回だけ解決

buildListItems 内で resolveBranchBaseCommit を1回呼び、結果を getFilesChangedgetOriginalInstruction の両方に渡す。現状は同じ計算を2回実行している。

対象ファイル: src/infra/task/branchList.ts (BranchManager.buildListItems, getFilesChanged, getOriginalInstruction)

効果: 2x → 1x(ブランチあたりの base commit 解決回数を半減)

2. listCandidateRefs を全ブランチで使い回す

git for-each-ref の結果は同じリポジトリなら共通。現状はブランチごとに毎回呼んでいる。ブランチ名でのフィルタだけ変えればよい。

対象ファイル: src/infra/task/branchGitResolver.ts (listCandidateRefs, resolveBranchBaseCommitFromRefs)

効果: N回の git for-each-ref → 1回

3. resolveBaseCandidate の候補を絞る

全 ref に対して merge-base を計算するのが最も重い。defaultBranchorigin/defaultBranch を優先候補にして、それで解決できたら全 ref 走査をスキップする。

対象ファイル: src/infra/task/branchGitResolver.ts (resolveBranchBaseCommitFromRefs)

効果: M refs × 3 cmds → 優先候補のみ(多くの場合 2 refs × 3 cmds)

関連ファイル

  • src/infra/task/branchList.tsBranchManager クラス
  • src/infra/task/branchGitResolver.ts — base commit 解決ロジック
  • src/features/tasks/list/index.tslistTasks エントリポイント

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions