aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Möhrmann <moehrmann@google.com>2018-10-22 20:47:54 +0200
committerMartin Möhrmann <martisch@uos.de>2018-10-23 16:48:01 +0000
commit1e50dd02a98bce8901cf10634ee0b2c8bbe4da81 (patch)
treeb0a1ae4efcb729f5693b751fe626d60f4dae117f /src
parent286c7ae10c71a8faeba22e29928afe7fce7e2750 (diff)
downloadgo-1e50dd02a98bce8901cf10634ee0b2c8bbe4da81.tar.xz
runtime: use multiplication with overflow check for newarray
This improves performance for e.g. maps with a bucket size (key+value*8 bytes) larger than 32 bytes and removes loading a value from the maxElems array for smaller bucket sizes. name old time/op new time/op delta MakeMap/[Byte]Byte 95.5ns ± 1% 94.7ns ± 1% -0.78% (p=0.013 n=9+9) MakeMap/[Int]Int 128ns ± 0% 121ns ± 2% -5.63% (p=0.000 n=6+10) Updates #21588 Change-Id: I7d9eb7d49150c399c15dcab675e24bc97ff97852 Reviewed-on: https://go-review.googlesource.com/c/143997 Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/malloc.go6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
index dad4773cb8..12fa744052 100644
--- a/src/runtime/malloc.go
+++ b/src/runtime/malloc.go
@@ -106,6 +106,7 @@ package runtime
import (
"runtime/internal/atomic"
+ "runtime/internal/math"
"runtime/internal/sys"
"unsafe"
)
@@ -1040,10 +1041,11 @@ func newarray(typ *_type, n int) unsafe.Pointer {
if n == 1 {
return mallocgc(typ.size, typ, true)
}
- if n < 0 || uintptr(n) > maxSliceCap(typ.size) {
+ mem, overflow := math.MulUintptr(typ.size, uintptr(n))
+ if overflow || mem > maxAlloc || n < 0 {
panic(plainError("runtime: allocation size out of range"))
}
- return mallocgc(typ.size*uintptr(n), typ, true)
+ return mallocgc(mem, typ, true)
}
//go:linkname reflect_unsafe_NewArray reflect.unsafe_NewArray