Skip to content

perf: batch opencode grep message reads#110

Merged
sorafujitani merged 1 commit into
mainfrom
perf/opencode-batched-messages
Jul 3, 2026
Merged

perf: batch opencode grep message reads#110
sorafujitani merged 1 commit into
mainfrom
perf/opencode-batched-messages

Conversation

@sorafujitani

Copy link
Copy Markdown
Owner

Summary

  • batch OpenCode grep body checks for candidates whose LIKE prefilter is disabled
  • preserve projection-over-parts semantics while avoiding one Messages(id, 0) call per candidate
  • bound Messages(id, limit) SQL reads for projection and parts stores
  • keep total/start time for preview headers via separate count/start queries
  • add regression tests for disabled-prefilter batch grep, projection priority, and limit boundary behavior

Fixes #103

Benchmark

Commands:

go test -run '^$' -bench='Benchmark(GrepKeysHitAndMiss|GrepKeysPrefilterDisabled|MessagesLargeSession)' -benchmem ./internal/opencode -count=10

Disabled-prefilter grep baseline was measured on origin/main with only BenchmarkGrepKeysPrefilterDisabled added temporarily.

GrepKeysPrefilterDisabled/hit-12   184.707m ± 2%   2.771m ± 1%  -98.50% (p=0.000 n=10)
GrepKeysPrefilterDisabled/miss-12  183.459m ± 2%   2.783m ± 1%  -98.48% (p=0.000 n=10)

GrepKeysPrefilterDisabled/hit-12   1764.0Ki ± 0%  819.0Ki ± 0%  -53.57% (p=0.000 n=10)
GrepKeysPrefilterDisabled/miss-12  1763.8Ki ± 0%  818.8Ki ± 0%  -53.58% (p=0.000 n=10)

GrepKeysPrefilterDisabled/hit-12   42.54k ± 0%  22.73k ± 0%  -46.57% (p=0.000 n=10)
GrepKeysPrefilterDisabled/miss-12  42.54k ± 0%  22.73k ± 0%  -46.57% (p=0.000 n=10)

Existing benchmark comparison:

GrepKeysHitAndMiss/hit-12   26.50m ± 1%  26.21m ± 1%  -1.12% (p=0.005 n=10)
GrepKeysHitAndMiss/miss-12  27.24m ± 1%  26.88m ± 0%  -1.31% (p=0.000 n=10)
MessagesLargeSession-12      2.979m ± 1%  4.498m ± 3%  +50.96% (p=0.000 n=10)

MessagesLargeSession-12  1106.52Ki ± 0%  36.95Ki ± 0%  -96.66% (p=0.000 n=10)
MessagesLargeSession-12  30057.0 ± 0%     977.0 ± 0%    -96.75% (p=0.000 n=10)

MessagesLargeSession uses small synthetic bodies, so the extra count/start query costs more wall time than it saves in this microbenchmark. The bounded path still avoids fetching all message rows for preview and cuts memory/allocations by about 97%, which is the intended behavior for large real sessions.

Verification

go test ./...
go vet ./...
golangci-lint run
gofmt -l $(git ls-files '*.go')
git diff --check

@sorafujitani sorafujitani merged commit 4865ccb into main Jul 3, 2026
7 checks passed
@sorafujitani sorafujitani deleted the perf/opencode-batched-messages branch July 3, 2026 06:14
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.

perf: fix opencode grep N+1 queries and unbounded message fetch

1 participant