diff options
| author | blasty <blasty@local> | 2026-08-10 01:51:28 +0200 |
|---|---|---|
| committer | blasty <blasty@local> | 2026-08-10 01:51:28 +0200 |
| commit | af1aa95b3a140988b101ee32a1ed9602f4645d56 (patch) | |
| tree | 66ecdeca18f5831ae796f425c3961de167cb74d1 /.auto/wip-decompmap.patch | |
| parent | Build the listing index in one call: boot 9.3s -> 1.25s, 911 calls -> 4 (diff) | |
| download | ida-tui-main.tar.gz ida-tui-main.tar.xz ida-tui-main.zip | |
Reported as "decompiler -> listing feels slow", and it was: ~900ms per Tab.
The listing view re-primes every time it is shown, and priming now builds the
whole row index. build_from_index() had no idempotence, so each switch back
re-ran segment_index over the entire segment. Measured on bash, going back to
the listing away from the primed viewport:
press Tab: 904ms -> 9.7ms, and 5 backend calls -> 0
The index is a pure function of the database and the model is thrown away and
rebuilt whenever anything moves the walk (stale_structure), so a model that is
already indexed can return immediately.
Nothing caught this because the listing was CORRECT the whole time -- only
slow. Every structural assertion passed, boot still measured fast, and the
suite has no notion of "how many calls did that keystroke cost". The new
scenario counts backend calls across three view switches and asserts
segment_index is not among them; with the guard removed again it fails.
Latent and NOT fixed here: materialising a page the viewport reaches for the
first time still happens inside render_line, i.e. an RPC (~20ms) on the UI
loop. That predates this change -- it is how skeleton pages have always
worked -- and is small enough not to read as a stall, but it is the same shape
of bug and wants prefetching onto the worker that already exists for pages.
Full gate: 1064 passed.
Diffstat (limited to '')
0 files changed, 0 insertions, 0 deletions
