github.com/BurntSushi/xgb@v0.0.0-20210121224620-deaf085860bc/examples/atoms/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "os" 8 "runtime" 9 "runtime/pprof" 10 "time" 11 12 "github.com/BurntSushi/xgb" 13 "github.com/BurntSushi/xgb/xproto" 14 ) 15 16 var ( 17 flagRequests int 18 flagGOMAXPROCS int 19 flagCpuProfName string 20 flagMemProfName string 21 ) 22 23 func init() { 24 flag.IntVar(&flagRequests, "requests", 100000, "Number of atoms to intern.") 25 flag.IntVar(&flagGOMAXPROCS, "cpu", 1, "Value of GOMAXPROCS.") 26 flag.StringVar(&flagCpuProfName, "cpuprof", "cpu.prof", 27 "Name of CPU profile file.") 28 flag.StringVar(&flagMemProfName, "memprof", "mem.prof", 29 "Name of memory profile file.") 30 31 flag.Parse() 32 33 runtime.GOMAXPROCS(flagGOMAXPROCS) 34 } 35 36 func seqNames(n int) []string { 37 names := make([]string, n) 38 for i := range names { 39 names[i] = fmt.Sprintf("NAME%d", i) 40 } 41 return names 42 } 43 44 func main() { 45 X, err := xgb.NewConn() 46 if err != nil { 47 log.Fatal(err) 48 } 49 50 names := seqNames(flagRequests) 51 52 fcpu, err := os.Create(flagCpuProfName) 53 if err != nil { 54 log.Fatal(err) 55 } 56 defer fcpu.Close() 57 pprof.StartCPUProfile(fcpu) 58 defer pprof.StopCPUProfile() 59 60 start := time.Now() 61 cookies := make([]xproto.InternAtomCookie, flagRequests) 62 for i := 0; i < flagRequests; i++ { 63 cookies[i] = xproto.InternAtom(X, 64 false, uint16(len(names[i])), names[i]) 65 } 66 for _, cookie := range cookies { 67 cookie.Reply() 68 } 69 fmt.Printf("Exec time: %s\n\n", time.Since(start)) 70 71 fmem, err := os.Create(flagMemProfName) 72 if err != nil { 73 log.Fatal(err) 74 } 75 defer fmem.Close() 76 pprof.WriteHeapProfile(fmem) 77 78 memStats := &runtime.MemStats{} 79 runtime.ReadMemStats(memStats) 80 81 // This isn't right. I'm not sure what's wrong. 82 lastGcTime := time.Unix(int64(memStats.LastGC/1000000000), 83 int64(memStats.LastGC-memStats.LastGC/1000000000)) 84 85 fmt.Printf("Alloc: %d\n", memStats.Alloc) 86 fmt.Printf("TotalAlloc: %d\n", memStats.TotalAlloc) 87 fmt.Printf("LastGC: %s\n", lastGcTime) 88 fmt.Printf("PauseTotalNs: %d\n", memStats.PauseTotalNs) 89 fmt.Printf("PauseNs: %d\n", memStats.PauseNs) 90 fmt.Printf("NumGC: %d\n", memStats.NumGC) 91 }