htable: use "perfect" bit to reduce rehashes.
Steal one bit to indicate an entry is in its perfect position. This means we don't have to rehash it when we are rehashing the entire table to get rid of deleted records, and we can still use it for comparison during lookup. Before: $ ./speed 50000000 Initial insert: 462 ns Details: hash size 134217728, mask bits 5, perfect 81% Initial lookup (match): 161 ns Initial lookup (miss): 168 ns Initial lookup (random): 326 ns Initial delete all: 164 ns Details: rehashes 50000000 Initial re-inserting: 167 ns Deleting first half: 86 ns Details: rehashes 25000000, delete markers 25000000 Adding (a different) half: 217 ns Details: delete markers 0, perfect 81% Lookup after half-change (match): 169 ns Lookup after half-change (miss): 180 ns Details: initial churn Churning second time: 593 ns Churning third time: 611 ns Churning fourth time: 619 ns Churning fifth time: 622 ns Details: reinserting with spread Details: delete markers 13800468, perfect 73% Details: worst run 48 (4 deleted) Lookup after churn & spread (match): 192 ns Lookup after churn & spread (miss): 211 ns Lookup after churn & spread (random): 373 ns Deleting half after churn & spread: 103 ns Adding (a different) half after churn & spread: 102 ns Details: delete markers 29539689, perfect 72% After: Initial insert: 467 ns Details: hash size 134217728, mask bits 5, perfect 81% Initial lookup (match): 163 ns Initial lookup (miss): 171 ns Initial lookup (random): 326 ns Initial delete all: 170 ns Details: rehashes 50000000 Initial re-inserting: 169 ns Deleting first half: 88 ns Details: rehashes 25000000, delete markers 25000000 Adding (a different) half: 141 ns Details: delete markers 0, perfect 81% Lookup after half-change (match): 166 ns Lookup after half-change (miss): 171 ns Details: initial churn Churning second time: 441 ns Churning third time: 469 ns Churning fourth time: 466 ns Churning fifth time: 490 ns Details: reinserting with spread Details: delete markers 13800468, perfect 73% Details: worst run 48 (4 deleted) Lookup after churn & spread (match): 197 ns Lookup after churn & spread (miss): 209 ns Lookup after churn & spread (random): 369 ns Deleting half after churn & spread: 98 ns Adding (a different) half after churn & spread: 100 ns Details: delete markers 29539689, perfect 72%
Showing
Please register or sign in to comment