Skip to content

fix(table): make hash traversal linear - #152

Open
efegokdemir wants to merge 3 commits into
Shopify:mainfrom
efegokdemir:efe/hash-table-iteration
Open

efegokdemir wants to merge 3 commits into
Shopify:mainfrom
efegokdemir:efe/hash-table-iteration

Conversation

@efegokdemir

Copy link
Copy Markdown

Hash-backed next traversals rescan the cached key list on every call. Cache each key's position so a complete traversal is linear, using raw key identity rather than invoking __eq for table or userdata keys. The index is built lazily and invalidated when a new hash key is inserted.

A local Next microbenchmark with 50,000 string keys went from 33.27 s to 8.29 ms (median of three first traversals, Go 1.27.1, Apple M2). First-traversal allocations increased from 0.80 MB to 2.55 MB for the position index.

Focused race tests passed in 20 runs, as did builds with Go 1.22.1 and 1.27.1 and production-code vet. The full race suite fails TestParserExhaustively on a 1e33 rounding difference with Lua 5.2.4; full vet reports the existing ExampleFunction signature errors in doc_test.go. Both also reproduce with upstream tables.go.

Fixes #136.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Performance Issue: Slow Table Iteration

1 participant