Go Profiling Samples
Some samples implementations to illustrate how to use
Go Profiling to improve a Go code.
Samples
This project has three implementations with issues performance common
in a Go code.
JSON Unmarshalling sample
Simple implementation that will do a unmarshall multiple times as defined on param.
GET /json/unmarshall?times={times}
func Unmarshall[T any](times int) (result T) {
file, err := os.ReadFile(fmt.Sprintf("%stest.json", Path))
if err != nil {
panic(err)
}
for i := 0; i <= times; i++ {
err = json.NewDecoder(bytes.NewReader(file)).Decode(&result)
if err != nil {
panic(err)
}
}
return
}
samples/json.go
Load location with timezone sample
Simple implementation that will load a location with tz multiple times as defined on param.
GET /timezone?times={times}
func Timezone(times int) (tz *time.Location) {
for i := 0; i <= times; i++ {
var err error
tz, err = time.LoadLocation("America/Sao_Paulo")
if err != nil {
panic(err)
}
}
return
}
samples/timezone.go
Allocations inside a loop sample
Simple implementation that will create an object and append on slice and iterate it
multiple times as defined on param.
GET /aloc?times={times}
func Aloc[O any, T []O](obj O, times int) (result T) {
for i := 0; i <= times; i++ {
result = append(result, obj)
}
for _, o := range result {
fmt.Printf("%+v\n", o)
}
return
}
samples/aloc.go
Using pprof
On this project we will use the HTTP pkg to run the pprof.
Starting the app
First we will start the app.
go run .
Running the pprof
To generate the pprof data and render it on a web page
we have to execute passing the expected endpoint available with follow args:
go tool pprof -http=localhost: http://localhost:7777/debug/pprof/profile?seconds=60
Simulating HTTP requests
Now for the pprof data has some metrics
we have to simulate some parallel requests immediately after run the pprof.
curl "http://localhost:7777/json/unmarshall?times=10000000" &
curl "http://localhost:7777/timezone?times=100000" &
curl "http://localhost:7777/aloc?times=1000000" &
Expected web page
After 60 seconds we have to be redirected to a web page as below:
https://youtu.be/hmD9zBjuc74 "Go tool pprof web interactive"
Pull requests with improvements of the samples