aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mksizeclasses.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2021-03-08 15:36:28 -0800
committerMatthew Dempsky <mdempsky@google.com>2021-03-12 17:41:56 +0000
commit735647d92e839f9ac3a91864a2c34263338a35e6 (patch)
tree4d3acc05d70c4ccd622d62acb173cdd12871d6df /src/runtime/mksizeclasses.go
parent086357e8f617c325339fdaedd13563dbdb05b00d (diff)
downloadgo-735647d92e839f9ac3a91864a2c34263338a35e6.tar.gz
go-735647d92e839f9ac3a91864a2c34263338a35e6.zip
runtime: add alignment info to sizeclasses.go comments
I was curious about the minimum possible alignment for each size class and the minimum size to guarantee any particular alignment (e.g., to know at what class size you can start assuming heap bits are byte- or word-aligned). Change-Id: I205b750286e8914986533c4f60712c420c3e63e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/299909 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Trust: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/runtime/mksizeclasses.go')
-rw-r--r--src/runtime/mksizeclasses.go26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/runtime/mksizeclasses.go b/src/runtime/mksizeclasses.go
index b4a117d343..8b9bbe01e6 100644
--- a/src/runtime/mksizeclasses.go
+++ b/src/runtime/mksizeclasses.go
@@ -37,6 +37,7 @@ import (
"go/format"
"io"
"log"
+ "math/bits"
"os"
)
@@ -242,8 +243,9 @@ nextk:
}
func printComment(w io.Writer, classes []class) {
- fmt.Fprintf(w, "// %-5s %-9s %-10s %-7s %-10s %-9s\n", "class", "bytes/obj", "bytes/span", "objects", "tail waste", "max waste")
+ fmt.Fprintf(w, "// %-5s %-9s %-10s %-7s %-10s %-9s %-9s\n", "class", "bytes/obj", "bytes/span", "objects", "tail waste", "max waste", "min align")
prevSize := 0
+ var minAligns [32]int
for i, c := range classes {
if i == 0 {
continue
@@ -252,8 +254,28 @@ func printComment(w io.Writer, classes []class) {
objects := spanSize / c.size
tailWaste := spanSize - c.size*(spanSize/c.size)
maxWaste := float64((c.size-prevSize-1)*objects+tailWaste) / float64(spanSize)
+ alignBits := bits.TrailingZeros(uint(c.size))
+ for i := range minAligns {
+ if i > alignBits {
+ minAligns[i] = 0
+ } else if minAligns[i] == 0 {
+ minAligns[i] = c.size
+ }
+ }
prevSize = c.size
- fmt.Fprintf(w, "// %5d %9d %10d %7d %10d %8.2f%%\n", i, c.size, spanSize, objects, tailWaste, 100*maxWaste)
+ fmt.Fprintf(w, "// %5d %9d %10d %7d %10d %8.2f%% %9d\n", i, c.size, spanSize, objects, tailWaste, 100*maxWaste, 1<<alignBits)
+ }
+ fmt.Fprintf(w, "\n")
+
+ fmt.Fprintf(w, "// %-9s %-4s %-12s\n", "alignment", "bits", "min obj size")
+ for bits, size := range minAligns {
+ if size == 0 {
+ break
+ }
+ if bits+1 < len(minAligns) && size == minAligns[bits+1] {
+ continue
+ }
+ fmt.Fprintf(w, "// %9d %4d %12d\n", 1<<bits, bits, size)
}
fmt.Fprintf(w, "\n")
}