mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-21 05:50:55 +08:00
Number-keyed maps index small integer keys through a direct table sized by the largest key ever stored, and bucket tables are sized by the most entries ever held; neither shrank. scr_map_clear memset both on every call, even on an empty map, so a collection that was large once paid its peak size on every later clear. tsc-ts' Relater.reset clears a Set<number> on every relation check: on Sentry, 36% of the CPU was that memset. - clear() resets only the direct-index slots of the entries it removes (the table is zero at every absent key), resets the bucket table only when entries pointed into it and it is proportional to them, and frees storage far larger than the entries removed, returning the map to its initial state as V8 does. Clearing an empty map does no work. - delete compacts once fewer than a quarter of at least 64 entries are live (V8's shrink point), so iteration after mass deletion is O(live). - Compaction shrinks oversized bucket tables, and after a delete or an iteration it shrinks the direct index to the surviving keys or moves keys that became sparse back to hashing. The append path keeps the current index: it holds a slot of it. Insertion order and live iteration are unchanged: nothing compacts while an iteration is active.