| package main |
| |
| import ( |
| "os" |
| "runtime" |
| "runtime/pprof" |
| ) |
| |
| type profiler struct { |
| cpuProfile *os.File |
| memProfile string |
| } |
| |
| // newProfiler creates a profiler that writes to the given files. |
| // it returns an empty profiler if both files are empty. |
| // so that stop() will never fail. |
| func newProfiler(cpuProfile, memProfile string) (profiler, error) { |
| if cpuProfile == "" { |
| return profiler{ |
| memProfile: memProfile, |
| }, nil |
| } |
| |
| f, err := os.Create(cpuProfile) |
| if err != nil { |
| return profiler{}, err |
| } |
| pprof.StartCPUProfile(f) |
| |
| return profiler{ |
| cpuProfile: f, |
| memProfile: memProfile, |
| }, nil |
| } |
| |
| func (p *profiler) stop() error { |
| if p.cpuProfile != nil { |
| pprof.StopCPUProfile() |
| p.cpuProfile.Close() |
| } |
| |
| if p.memProfile == "" { |
| return nil |
| } |
| |
| f, err := os.Create(p.memProfile) |
| if err != nil { |
| return err |
| } |
| defer f.Close() |
| runtime.GC() |
| return pprof.WriteHeapProfile(f) |
| } |