• 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
api Loading commit data...
doc Loading commit data...
include Loading commit data...
lib Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.hgignore Loading commit data...
.hgtags Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...