diff options
Diffstat (limited to 'profile')
| -rw-r--r-- | profile/go.mod | 3 | ||||
| -rw-r--r-- | profile/profile.go | 64 |
2 files changed, 67 insertions, 0 deletions
diff --git a/profile/go.mod b/profile/go.mod new file mode 100644 index 0000000..3fcd33c --- /dev/null +++ b/profile/go.mod @@ -0,0 +1,3 @@ +module go.jknobloc.com/x/profile + +go 1.25 diff --git a/profile/profile.go b/profile/profile.go new file mode 100644 index 0000000..5654ba1 --- /dev/null +++ b/profile/profile.go @@ -0,0 +1,64 @@ +package profile + +import ( + "flag" + "log" + "os" + "runtime" + "runtime/pprof" +) + +var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`") +var memprofile = flag.String("memprofile", "", "write memory profile to `file`") + +func CPU() func() { + flag.Parse() + + if *cpuprofile == "" { + return nil + } + + var file *os.File + + if f, err := os.Create(*cpuprofile); err != nil { + log.Fatal("could not create CPU profile: ", err) + } else { + file = f + } + + if err := pprof.StartCPUProfile(file); err != nil { + log.Fatal("could not start CPU profile: ", err) + } + + return func() { + pprof.StopCPUProfile() + + if err := file.Close(); err != nil { + log.Fatal(err) + } + } +} + +func Mem() { + flag.Parse() + + if *memprofile == "" { + return + } + + var file *os.File + + if f, err := os.Create(*memprofile); err != nil { + log.Fatal("could not create memory profile: ", err) + } else { + file = f + + defer file.Close() + } + + runtime.GC() + + if err := pprof.Lookup("allocs").WriteTo(file, 0); err != nil { + log.Fatal("could not write memory profile: ", err) + } +} |
