• Brad Fitzpatrick's avatar
    runtime: avoid hashing strings until needed in single-bucket maps · 45b54ee7
    Brad Fitzpatrick authored
    This changes the map lookup behavior for string maps with 2-8 keys.
    
    There was already previously a fastpath for 0 items and 1 item.
    
    Now, if a string-keyed map has <= 8 items, first check all the
    keys for length first. If only one has the right length, then
    just check it for equality and avoid hashing altogether. Once
    the map has more than 8 items, always hash like normal.
    
    I don't know why some of the other non-string map benchmarks
    got faster. This was with benchtime=2s, multiple times. I haven't
    anything else getting slower, though.
    
    benchmark                             old ns/op    new ns/op    delta
    BenchmarkHashStringSpeed                     37           34   -8.20%
    BenchmarkHashInt32Speed                      32           29  -10.67%
    BenchmarkHashInt64Speed                      31           27  -12.82%
    BenchmarkHashStringArraySpeed               105           99   -5.43%
    BenchmarkMegMap                          274206       255153   -6.95%
    BenchmarkMegOneMap                           27           23  -14.80%
    BenchmarkMegEqMap                        148332       116089  -21.74%
    BenchmarkMegEmptyMap                          4            3  -12.72%
    BenchmarkSmallStrMap                         22           22   -0.89%
    BenchmarkMapStringKeysEight_32               42           23  -43.71%
    BenchmarkMapStringKeysEight_64               55           23  -56.96%
    BenchmarkMapStringKeysEight_1M           279688           24  -99.99%
    BenchmarkIntMap                              16           15  -10.18%
    BenchmarkRepeatedLookupStrMapKey32           40           37   -8.15%
    BenchmarkRepeatedLookupStrMapKey1M       287918       272980   -5.19%
    BenchmarkNewEmptyMap                        156          130  -16.67%
    
    R=golang-dev, khr
    CC=golang-dev
    https://golang.org/cl/7641057
    45b54ee7
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...