summaryrefslogtreecommitdiff
path: root/profile
diff options
context:
space:
mode:
Diffstat (limited to 'profile')
-rw-r--r--profile/go.mod3
-rw-r--r--profile/profile.go64
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)
+ }
+}