- Notifications
You must be signed in to change notification settings - Fork27
structslop is a static analyzer for Go that recommends struct field rearrangements to provide for maximum space/allocation efficiency.
License
orijtech/structslop
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Package structslop defines anAnalyzer that checks if struct fields can be re-arranged to optimize size.
With Go modules:
go get github.com/orijtech/structslop/cmd/structslop
Without Go modules:
$cd$GOPATH/src/github.com/orijtech/structslop$ git checkout v0.0.6$ go get$ install ./cmd/structslop
You can runstructslop
either on a Go package or Go files, the same way asother Go tools work.
Example:
$ structslop github.com/orijtech/structslop/testdata/src/struct
or:
$ structslop ./testdata/src/struct/p.go
Sample output:
/go/src/github.com/orijtech/structslop/testdata/struct/p.go:30:9: struct has size 24 (size class 32), could be 16 (size class 16), you'll save 50.00% if you rearrange it to:struct {y uint64x uint32z uint32}/go/src/github.com/orijtech/structslop/testdata/struct/p.go:36:9: struct has size 40 (size class 48), could be 24 (size class 32), you'll save 33.33% if you rearrange it to:struct {_ [0]func()i1 inti2 inta3 [3]boolb bool}/go/src/github.com/orijtech/structslop/testdata/struct/p.go:59:9: struct has size 40 (size class 48), could be 32 (size class 32), you'll save 33.33% if you rearrange it to:struct {y uint64t *httptest.Serverw uint64x uint32z uint32}/go/src/github.com/orijtech/structslop/testdata/struct/p.go:67:9: struct has size 40 (size class 48), could be 32 (size class 32), you'll save 33.33% if you rearrange it to:struct {y uint64t *sw uint64x uint32z uint32}
Example, for the first report above, the output meaning:
- The current struct size is
24
, the size that the Go runtime will allocate for that struct is32
. - The optimal struct size is
16
, the size that the Go runtime will allocate for that struct is16
. - The layout of optimal struct.
- The percentage savings with new struct layout.
That said, some structs may have a smaller size, but for efficiency, the Go runtime will allocate them in the same size class,then those structs are not considered sloppy:
types1struct {xuint32yuint64z*stuint32}
and:
types2struct {yuint64z*sxuint32tuint32}
have the same size class32
, thoughs2
layout is only24
byte in size.
However, you can still get this information when you want, using-verbose
flag:
$ structslop -verbose ./testdata/src/verbose/p.go/go/src/github.com/orijtech/structslop/testdata/src/verbose/p.go:17:8: struct has size 0 (size class 0)/go/src/github.com/orijtech/structslop/testdata/src/verbose/p.go:19:9: struct has size 1 (size class 8)/go/src/github.com/orijtech/structslop/testdata/src/verbose/p.go:23:9: struct has size 32 (size class 32), could be 24 (size class 32), optimal fields order:struct {y uint64z*sx uint32t uint32}
Note
For applying suggested fix, use-apply
flag, instead of-fix
.
Go 1.20+
Add test case totestdata/src/struct
directory, then run:
gotest
TODO
About
structslop is a static analyzer for Go that recommends struct field rearrangements to provide for maximum space/allocation efficiency.