Profiling Go code

2020-07-11 on adnano.co

Profiling a Go program is relatively simple. First we have to import "runtime/pprof" and add some code:

func main() {
	// CPU profile
	if path := os.Getenv("CPUPROFILE"); path != "" {
		f, err := os.Create(path)
		if err != nil {
			log.Fatal(err)
		}
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}

	// ... (Your code here)

	// Memory profile
	if path := os.Getenv("MEMPROFILE"); path != "" {
		f, err := os.Create(path)
		if err != nil {
			log.Fatal(err)
		}
		pprof.WriteHeapProfile(f)
		f.Close()
	}
}

This code enables CPU and memory profiling if the CPUPROFILE and MEMPROFILE environment variables are set. It will then write the profile results to the path provided in the respective environment variable.

For example, the following writes the results of a CPU profile to "example.cpuprof":

# CPU profile
env CPUPROFILE=example.cpuprof go run example

And the following writes the results of a memory profile to "example.memprof":

# Memory profile
env MEMPROFILE=example.memprof go run example

We can then view the results with "go tool pprof". The following command generates a graph and opens it in your web browser:

go tool pprof -web example.memprof

Note that you need to have "graphviz" installed to render the graph.

For more information, see Profiling Go Programs.