Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

structslop is a static analyzer for Go that recommends struct field rearrangements to provide for maximum space/allocation efficiency.

License

NotificationsYou must be signed in to change notification settings

orijtech/structslop

Repository files navigation

Build status

Package structslop defines anAnalyzer that checks if struct fields can be re-arranged to optimize size.

Installation

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

Usage

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 is24, the size that the Go runtime will allocate for that struct is32.
  • The optimal struct size is16, 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.

Development

Go 1.20+

Running test

Add test case totestdata/src/struct directory, then run:

gotest

Contributing

TODO

About

structslop is a static analyzer for Go that recommends struct field rearrangements to provide for maximum space/allocation efficiency.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages


[8]ページ先頭

©2009-2025 Movatter.jp