From 5957487b70465b80a279824145954cfadaebd7e1 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 11 Nov 2023 16:37:00 -0500 Subject: [PATCH] Faster iteration over non-empty entries for hash table resizing --- src/singeli/src/hashtab.singeli | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/singeli/src/hashtab.singeli b/src/singeli/src/hashtab.singeli index 85c8142d..a67cff5f 100644 --- a/src/singeli/src/hashtab.singeli +++ b/src/singeli/src/hashtab.singeli @@ -60,8 +60,15 @@ def hash_alloc{logsz, msz, ext, Ts, v0s, ordered} = { k:tupsel{0,Ts} = 0; --k each{{p,v} => { p -= dif; memset{p, v, dif} }, ptrs, v0s} def {hash, ...vals} = ptrs; def {h0, ...v0r} = v0s - @for (h in hash over j from dif to sz + ext) { - if (h != h0) { + s := sz+ext + i := dif + while (i < s) { + e := min{s-i, usz~~32} + b:u32 = 0 + @for_backwards (h in hash+i over e) b = 2*b + promote{u32, h!=h0} + while (b!=0) { + j := i + cast_i{usz,ctz{b}}; b &= b-1 + h := hash->j hash <-{j} h0 k0 := h>>sh if (ordered) { k = max{k0, k+1} } # k0 can't be less than k @@ -73,6 +80,7 @@ def hash_alloc{logsz, msz, ext, Ts, v0s, ordered} = { } each{move, vals, v0r} } + i += e } }