A pathological example for profiling purposes. Use 'make test'.
This commit is contained in:
parent
e960f4d34e
commit
8ee0ea9899
3
nexgb/examples/atoms/.gitignore
vendored
Normal file
3
nexgb/examples/atoms/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
atoms
|
||||
*.info
|
||||
*.prof
|
12
nexgb/examples/atoms/Makefile
Normal file
12
nexgb/examples/atoms/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
atoms:
|
||||
go build
|
||||
|
||||
test: atoms
|
||||
./atoms --requests 500000 --cpu 1 \
|
||||
--cpuprof cpu1.prof --memprof mem1.prof > atoms1.info 2>&1
|
||||
./atoms --requests 500000 --cpu 2 \
|
||||
--cpuprof cpu2.prof --memprof mem2.prof > atoms2.info 2>&1
|
||||
./atoms --requests 500000 --cpu 3 \
|
||||
--cpuprof cpu3.prof --memprof mem3.prof > atoms3.info 2>&1
|
||||
./atoms --requests 500000 --cpu 6 \
|
||||
--cpuprof cpu6.prof --memprof mem6.prof > atoms6.info 2>&1
|
91
nexgb/examples/atoms/main.go
Normal file
91
nexgb/examples/atoms/main.go
Normal file
@ -0,0 +1,91 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"runtime"
|
||||
"runtime/pprof"
|
||||
"time"
|
||||
|
||||
"github.com/BurntSushi/xgb"
|
||||
"github.com/BurntSushi/xgb/xproto"
|
||||
)
|
||||
|
||||
var (
|
||||
flagRequests int
|
||||
flagGOMAXPROCS int
|
||||
flagCpuProfName string
|
||||
flagMemProfName string
|
||||
)
|
||||
|
||||
func init() {
|
||||
flag.IntVar(&flagRequests, "requests", 100000, "Number of atoms to intern.")
|
||||
flag.IntVar(&flagGOMAXPROCS, "cpu", 1, "Value of GOMAXPROCS.")
|
||||
flag.StringVar(&flagCpuProfName, "cpuprof", "cpu.prof",
|
||||
"Name of CPU profile file.")
|
||||
flag.StringVar(&flagMemProfName, "memprof", "mem.prof",
|
||||
"Name of memory profile file.")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
runtime.GOMAXPROCS(flagGOMAXPROCS)
|
||||
}
|
||||
|
||||
func seqNames(n int) []string {
|
||||
names := make([]string, n)
|
||||
for i := range names {
|
||||
names[i] = fmt.Sprintf("NAME%d", i)
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
func main() {
|
||||
X, err := xgb.NewConn()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
names := seqNames(flagRequests)
|
||||
|
||||
fcpu, err := os.Create(flagCpuProfName)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer fcpu.Close()
|
||||
pprof.StartCPUProfile(fcpu)
|
||||
defer pprof.StopCPUProfile()
|
||||
|
||||
start := time.Now()
|
||||
cookies := make([]xproto.InternAtomCookie, flagRequests)
|
||||
for i := 0; i < flagRequests; i++ {
|
||||
cookies[i] = xproto.InternAtom(X,
|
||||
false, uint16(len(names[i])), names[i])
|
||||
}
|
||||
for _, cookie := range cookies {
|
||||
cookie.Reply()
|
||||
}
|
||||
fmt.Printf("Exec time: %s\n\n", time.Since(start))
|
||||
|
||||
fmem, err := os.Create(flagMemProfName)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer fmem.Close()
|
||||
pprof.WriteHeapProfile(fmem)
|
||||
|
||||
memStats := &runtime.MemStats{}
|
||||
runtime.ReadMemStats(memStats)
|
||||
|
||||
// This isn't right. I'm not sure what's wrong.
|
||||
lastGcTime := time.Unix(int64(memStats.LastGC/1000000000),
|
||||
int64(memStats.LastGC-memStats.LastGC/1000000000))
|
||||
|
||||
fmt.Printf("Alloc: %d\n", memStats.Alloc)
|
||||
fmt.Printf("TotalAlloc: %d\n", memStats.TotalAlloc)
|
||||
fmt.Printf("LastGC: %s\n", lastGcTime)
|
||||
fmt.Printf("PauseTotalNs: %d\n", memStats.PauseTotalNs)
|
||||
fmt.Printf("PauseNs: %d\n", memStats.PauseNs)
|
||||
fmt.Printf("NumGC: %d\n", memStats.NumGC)
|
||||
}
|
Loading…
Reference in New Issue
Block a user