]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use multiplication with overflow check for newarray
authorMartin Möhrmann <moehrmann@google.com>
Mon, 22 Oct 2018 18:47:54 +0000 (20:47 +0200)
committerMartin Möhrmann <martisch@uos.de>
Tue, 23 Oct 2018 16:48:01 +0000 (16:48 +0000)
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>
src/runtime/malloc.go

index dad4773cb8e6f81c0a88087c63acb338431e663b..12fa744052acc016b438cba315b3261a1b005f10 100644 (file)
@@ -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