diff options
| author | Josh Bleecher Snyder <josharian@gmail.com> | 2017-07-16 17:37:27 -1000 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2017-08-14 23:31:22 +0000 |
| commit | 733567a1860956e87daa1a2fa46d58fc44b896cc (patch) | |
| tree | 91bc74d7d8638cacca55d9e3caa7aef844b9866d /src/runtime | |
| parent | 694875cbf27a70ce2f9b147a30a644380a82860e (diff) | |
| download | go-733567a1860956e87daa1a2fa46d58fc44b896cc.tar.xz | |
runtime: use integer math for hashmap overLoadFactor
Change-Id: I92cf39a05e738a03d956779d7a1ab1ef8074b2ab
Reviewed-on: https://go-review.googlesource.com/54655
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/hashmap.go | 9 | ||||
| -rw-r--r-- | src/runtime/stubs.go | 2 |
2 files changed, 6 insertions, 5 deletions
diff --git a/src/runtime/hashmap.go b/src/runtime/hashmap.go index 87d0d26cfa..64ec84474e 100644 --- a/src/runtime/hashmap.go +++ b/src/runtime/hashmap.go @@ -64,8 +64,10 @@ const ( bucketCntBits = 3 bucketCnt = 1 << bucketCntBits - // Maximum average load of a bucket that triggers growth. - loadFactor = 6.5 + // Maximum average load of a bucket that triggers growth is 6.5. + // Represent as loadFactorNum/loadFactDen, to allow integer math. + loadFactorNum = 13 + loadFactorDen = 2 // Maximum key or value size to keep inline (instead of mallocing per element). // Must fit in a uint8. @@ -984,8 +986,7 @@ func hashGrow(t *maptype, h *hmap) { // overLoadFactor reports whether count items placed in 1<<B buckets is over loadFactor. func overLoadFactor(count int64, B uint8) bool { - // TODO: rewrite to use integer math and comparison? - return count >= bucketCnt && float32(count) >= loadFactor*float32((uint64(1)<<B)) + return count >= bucketCnt && uint64(count) >= loadFactorNum*((uint64(1)<<B)/loadFactorDen) } // tooManyOverflowBuckets reports whether noverflow buckets is too many for a map with 1<<B buckets. diff --git a/src/runtime/stubs.go b/src/runtime/stubs.go index ce9b67a0ee..7f504e684e 100644 --- a/src/runtime/stubs.go +++ b/src/runtime/stubs.go @@ -91,7 +91,7 @@ func reflect_memmove(to, from unsafe.Pointer, n uintptr) { } // exported value for testing -var hashLoad = loadFactor +var hashLoad = float32(loadFactorNum) / float32(loadFactorDen) //go:nosplit func fastrand() uint32 { |
