Select direct peers without sorting every score
perfloop/go-ethereum · INEFFICIENT ALGORITHM
https://perfloop.ai/t/oss/case_7c4ggxn4eb
Verdict
VERIFIED · settled 2026-08-23 · pull request opened as ethereum/go-ethereum#35570
What happened: The paired measurements met the required improvement.
Hypothesis
I ran `go test ./eth -run '^$' -bench '^BenchmarkBroadcastChoice/(50|200|500)$' -benchtime=100ms -count=1`. The existing peer-choice benchmark measured 6,320 ns/op at 50 peers, 28,770 ns/op at 200 peers, and 78,008 ns/op at 500 peers on this runner. It measures `choosePeers` as a unit and does not isolate sort time or measure end-to-end propagation.
Source tracing shows that setup subscribes to new, non-resurrected transaction events and `txBroadcastLoop` calls `BroadcastTransactions` once for each delivered event. For every non-blob transaction at or below the direct-broadcast size limit in that event, `BroadcastTransactions` calls `choosePeers`. That helper hashes all P peers, fully sorts all P scored records, then reads only the first ceil(sqrt(P)) records into its returned map. No later code in the helper consumes the rest of the ordering. The candidate delta is removal of the full O(P log P) ordering comparisons for each qualifying transaction while retaining P score computations and the same top-n recipients. This is a medium-confidence source-based hypothesis; source does not establish production peer counts, event batch sizes, or the sort's CPU share.
Validate the replacement with a differential test against the current full-sort member set for fixed keys, sender addresses, peer sets, and boundary sizes including 49 and 50 peers, while preserving ceil(sqrt(P)) selection and tie behavior. Then benchmark and CPU-profile peer choice and end-to-end broadcast events across 50, 200, and 500 peers and batches of 1, 10, and 100 qualifying transactions. Confirm lower per-event CPU or ns/op and reduced sorting samples without changing direct recipient counts or announcement routing.
Change to test: Replace the full score sort with an in-place top-ceil(sqrt(P)) selection that preserves the chosen peer set. Keep score generation and the current direct-versus-announcement routing unchanged.
Where it lives
perfloop/go-ethereum · eth/handler.go
Evidence
direct peer selection, 50 peers · 10 sample pairs
| metric | baseline | candidate | paired median change | confidence range | required | result |
|---|---|---|---|---|---|---|
ns/op |
6535 |
4884 |
−23.5% (−1538) |
−2088 to −1470 |
< −326.8 |
PASSED |
direct peer selection, 200 peers · 10 sample pairs
| metric | baseline | candidate | paired median change | confidence range | required | result |
|---|---|---|---|---|---|---|
ns/op |
29130 |
18842 |
−36.6% (−10657) |
−12208 to −8839 |
< −1456 |
PASSED |
direct peer selection, 500 peers · 10 sample pairs
| metric | baseline | candidate | paired median change | confidence range | required | result |
|---|---|---|---|---|---|---|
ns/op |
76287 |
44727 |
−41.7% (−31801) |
−38342 to −29195 |
< −3814 |
PASSED |
Checks: 4 of 4 passed. Verification: no defect found.
Timeline
2026-08-19· Case opened2026-08-23· PR opened