vc=81 — perf-audit app-side batch (search debounce + feed-merge memoize)

Search: the reactive cache-preview filter no longer runs on the main
thread on every keystroke. It walked the whole cached-results pool
(thousands of items on a heavy user) inline; now each keystroke
debounces ~150ms and the scan runs on Dispatchers.Default. A submit
cancels the pending preview so a late scan can't clobber live results.

Feed: mergeFromCache memoizes the relative-upload-date parse by string,
so the recency regex runs once per distinct "N days ago" value instead
of once per item (~3000 per merge on a 200-sub feed) — across
hydration, every refresh, and each background-enrichment emit.

No behavior change.
This commit is contained in:
Sulkta 2026-06-21 06:26:40 -07:00
parent d9e5addb0b
commit f51b4fbb77
3 changed files with 79 additions and 22 deletions

View file

@ -9,6 +9,19 @@ const val STRAW_SDK_TARGET = 35
// Sulkta fork — Straw
//
// vc=81 / 0.1.0-CO — perf-audit app-side batch (no behavior change):
// * Search: the reactive cache-preview filter no longer runs on the
// main thread on every keystroke. It walked the entire cached-
// results pool (thousands of items on a heavy user) inline; now each
// keystroke debounces ~150ms and the scan runs on Dispatchers.Default.
// A submit cancels the pending preview so it can't clobber live
// results.
// * Subscription feed: the merge memoizes the relative-upload-date
// parse by string, so the recency regex runs once per distinct
// "N days ago" value instead of once per item (~3000 per merge on a
// 200-sub feed) — across hydration, every refresh, and each
// background-enrichment emit.
//
// vc=80 / 0.1.0-CN — strawcore extraction perf (Rust batch):
// * The extractor borrows the streamingData subtree out of the Android
// + iOS player responses instead of deep-cloning the largest part of
@ -121,6 +134,6 @@ const val STRAW_SDK_TARGET = 35
// vc=19 / 0.1.0-AE — rust pipeline cutover. Extraction via
// strawcore-core (Sulkta-OSS/strawcore) via the UniFFI wrapper; no
// NewPipeExtractor in the runtime path.
const val STRAW_VERSION_CODE = 80
const val STRAW_VERSION_NAME = "0.1.0-CN"
const val STRAW_VERSION_CODE = 81
const val STRAW_VERSION_NAME = "0.1.0-CO"
const val STRAW_APPLICATION_ID = "com.sulkta.straw"