Skip to content

v2.1.0 — Performance & Polish

Choose a tag to compare

@haxllo haxllo released this 20 Jun 15:24
· 1048 commits to master since this release

Massive indexing/search speedup, overlay startup deadlock fixes, no blank window on first show, and crate rename.

Changelog (24 commits since v2.0.0)

Performance

  • B-2: Pre-read ALL Tantivy segment files + SQLite DB into OS page cache — disk I/O eliminated from first keystroke
  • B-4: Icon decode throttle — first 8 sync, rest deferred to background thread — show latency cut ~60%
  • B-5: recv_timeout jitter + stop channel + select! instead of 50ms fixed poll — ~0.5ms idle wakeup eliminated
  • B-6: O(1) selection highlight via JS rowMap Map lookup — constant-time toggling
  • B-7: PostWebMessageAsJson sends pre-serialized JSON, JS gets object directly — IPC ~3x faster
  • B-8: Conditional scrollIntoView only when selected row outside visible area — less layout thrash
  • B-10: RwLock replaces Mutex<CoreService> — concurrent reads, no reader contention
  • Search cache warmup on overlay show — Tantivy searched once before first keystroke
  • Stale prune moved off search critical path to background thread
  • Adaptive debounce — first char instant, rapid chars coalesced at 80ms
  • Blocking evaluate_script replaced with fire-and-forget PostWebMessageAsString

Bug Fixes

  • Overlay hang after first indexing — sync_indexes_from_cache short-circuits when indexes already populated
  • ~30s delay after indexing with files — FTS5 index_items wraps inserts in BEGIN IMMEDIATE/COMMIT (was 9579 tiny segments)
  • Progress window deadlock — drop(fts5_guard) before maybe_compact_backends()
  • Progress window white flash — Delays show 200ms until WebView2 paints
  • Progress window acrylic — DWM rounded corners + acrylic blur
  • Progress evaluate_script re-enabled — Progress bar now actually updates
  • Blank window on first hotkey — Removed panel-in CSS animation (160ms opacity fade caused blank on fast press)
  • Polling thread eliminated — ControlFlow::Poll + direct AtomicU32 read replaces separate thread
  • Warm-release timer — Single timer thread replaces per-Hide thread spawning
  • Icon cache idle-trim — Dead code re-enabled, trims LRU icons when idle
  • Everything SDK race + DLL planting — Robust Everything detection

Architecture

  • Crate renamed nex-cli → nex-launch (binary stays nex.exe)
  • GUI subsystem — No console flash at startup
  • Cleanup: Remove vestigial icon_cache param from serve_asset/build_webview
  • Thread naming — All threads named for diagnostics
  • Dead SVG icon deps removed

Commit Log

  • f8a6aaf chore: bump to v2.1.0
  • 7457373 chore: rename crate nex-cli -> nex-launch
  • 3ed8a7d fix: avoid redundant FTS5/Tantivy re-index + progress window acrylic + first-show blank fix
  • df4996d fix: drop fts5_guard before maybe_compact_backends to prevent Mutex deadlock
  • d213256 fix: eliminate polling thread, use ControlFlow::Poll + direct AtomicU32 read
  • 41d8096 perf(B2): pre-read ALL Tantivy segment files + SQLite DB into OS page cache
  • 909c5ac fix: revert B-3 (manual JSON), keep serde_json; sync warmup before show
  • bbceb9f doc: mark all 10 bottlenecks as implemented
  • 4dc402e perf(B-7): PostWebMessageAsJson eliminates JS-side JSON.parse
  • 51f0cf9 perf(B-6,B-8): O(1) selection via rowMap + conditional scrollIntoView
  • 6ef6db6 perf(B-5): recv_timeout jitter — stop channel + select! instead of 50ms poll
  • 43287c4 perf(B-4): icon decode throttle — first 8 sync, rest deferred
  • e4f3cd4 perf(B-10): replace Mutex with RwLock for concurrent reads
  • f631fda perf: warm Tantivy search cache on overlay show
  • faf9548 perf: move stale prune off search critical path to background thread
  • c3fe990 perf: adaptive debounce — first char instant, rapid chars coalesced at 80ms
  • 60622fc perf: replace blocking evaluate_script with fire-and-forget PostWebMessageAsString
  • ae1f0c2 cleanup: remove vestigial icon_cache param from serve_asset / build_webview
  • 23335d1 fix: replace per-Hide warm-release threads with single timer thread
  • 00c32fc fix: name icon-prefetch threads and COM-uninitialize on exit
  • 1afb6a3 fix: icon cache idle-trim was dead code
  • 95e0555 feat: GUI subsystem, no console flash + remove dead SVG icon deps
  • 73eccfb fix: EverythingBridge SDK race, DLL planting, is_service_running state clobber
  • 7018aec fix: stale prune skips backends, FTS5 startup clear, progress window hang

Binary