github.com/joshprzybyszewski/masyu@v0.0.0-20230508015604-f31a025f6e7e/profile/start.go (about)

     1  package profile
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"runtime"
     7  	"runtime/pprof"
     8  )
     9  
    10  const (
    11  	cpuProfileFilename    = `cpu.pprof`
    12  	memoryProfileFilename = `mem.pprof`
    13  )
    14  
    15  func Start() func() {
    16  	f, err := os.Create(cpuProfileFilename)
    17  	if err != nil {
    18  		log.Printf("got error attempting to create cpu file: %q\n", err)
    19  		return func() {}
    20  	}
    21  
    22  	err = pprof.StartCPUProfile(f)
    23  	if err != nil {
    24  		log.Printf("got error attempting to start a profile: %q\n", err)
    25  		return func() {}
    26  	}
    27  
    28  	return func() {
    29  		pprof.StopCPUProfile()
    30  		err = f.Close()
    31  		if err != nil {
    32  			log.Printf("got error attempting to close profile file: %q\n", err)
    33  		}
    34  
    35  		f, err := os.Create(memoryProfileFilename)
    36  		if err != nil {
    37  			log.Printf("got error attempting to create memory file: %q\n", err)
    38  			return
    39  		}
    40  		defer f.Close() // error handling omitted for example
    41  		runtime.GC()    // get up-to-date statistics
    42  		if err := pprof.WriteHeapProfile(f); err != nil {
    43  			log.Printf("got error attempting to write memory file: %q\n", err)
    44  		}
    45  	}
    46  }