diff options
author | Matthew Dempsky <mdempsky@google.com> | 2021-03-08 15:36:28 -0800 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2021-03-12 17:41:56 +0000 |
commit | 735647d92e839f9ac3a91864a2c34263338a35e6 (patch) | |
tree | 4d3acc05d70c4ccd622d62acb173cdd12871d6df /src/runtime/mksizeclasses.go | |
parent | 086357e8f617c325339fdaedd13563dbdb05b00d (diff) | |
download | go-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.go | 26 |
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") } |