aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/malloc.go
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2024-09-18 01:58:50 +0000
committerGopher Robot <gobot@golang.org>2024-10-21 14:47:04 +0000
commit56fb8350c835d1ccf0e6cdb8f753c85e2e0748a8 (patch)
treef2024aa2b47f37cda439a53d6869056c87c1edff /src/runtime/malloc.go
parentd94b7a187685942579e7d7dc00bf58448cdafce8 (diff)
downloadgo-56fb8350c835d1ccf0e6cdb8f753c85e2e0748a8.tar.xz
runtime: don't call span.heapBits in writeHeapBitsSmall
For whatever reason, span.heapBits is kind of slow. It accounts for about a quarter of the cost of writeHeapBitsSmall, which is absurd. We get a nice speed improvement for small allocations by eliminating this call. │ before │ after │ │ sec/op │ sec/op vs base │ MallocTypeInfo16-4 29.47n ± 1% 27.02n ± 1% -8.31% (p=0.002 n=6) Change-Id: I6270e26902e5a9254cf1503fac81c3c799c59d6a Reviewed-on: https://go-review.googlesource.com/c/go/+/614255 Reviewed-by: Keith Randall <khr@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@google.com> Auto-Submit: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/malloc.go')
-rw-r--r--src/runtime/malloc.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
index 7076ced453..71dda120d4 100644
--- a/src/runtime/malloc.go
+++ b/src/runtime/malloc.go
@@ -427,8 +427,15 @@ func mallocinit() {
// Check that the minimum size (exclusive) for a malloc header is also
// a size class boundary. This is important to making sure checks align
// across different parts of the runtime.
+ //
+ // While we're here, also check to make sure all these size classes'
+ // span sizes are one page. Some code relies on this.
minSizeForMallocHeaderIsSizeClass := false
+ sizeClassesUpToMinSizeForMallocHeaderAreOnePage := true
for i := 0; i < len(class_to_size); i++ {
+ if class_to_allocnpages[i] > 1 {
+ sizeClassesUpToMinSizeForMallocHeaderAreOnePage = false
+ }
if minSizeForMallocHeader == uintptr(class_to_size[i]) {
minSizeForMallocHeaderIsSizeClass = true
break
@@ -437,6 +444,9 @@ func mallocinit() {
if !minSizeForMallocHeaderIsSizeClass {
throw("min size of malloc header is not a size class boundary")
}
+ if !sizeClassesUpToMinSizeForMallocHeaderAreOnePage {
+ throw("expected all size classes up to min size for malloc header to fit in one-page spans")
+ }
// Check that the pointer bitmap for all small sizes without a malloc header
// fits in a word.
if minSizeForMallocHeader/goarch.PtrSize > 8*goarch.PtrSize {