1
0
mirror of https://github.com/golang/go synced 2024-11-25 05:07:56 -07:00

testing: add -test.cpuprofile flag

R=r
CC=golang-dev
https://golang.org/cl/4272066
This commit is contained in:
Russ Cox 2011-03-23 18:17:14 -04:00
parent 14b9032f84
commit 543acc97f9
3 changed files with 39 additions and 17 deletions

View File

@ -203,8 +203,7 @@ func matchString(pat, str string) (result bool, err __os__.Error) {
} }
func main() { func main() {
testing.Main(matchString, tests) testing.Main(matchString, tests, benchmarks)
testing.RunBenchmarks(matchString, benchmarks)
}' }'
}>_testmain.go }>_testmain.go

View File

@ -2476,7 +2476,8 @@ sub RemoveUninterestingFrames {
# Nothing skipped for unknown types # Nothing skipped for unknown types
} }
if ($main::profile_type eq 'cpu') { # Go doesn't have the problem that this heuristic tries to fix. Disable.
if (0 && $main::profile_type eq 'cpu') {
# If all the second-youngest program counters are the same, # If all the second-youngest program counters are the same,
# this STRONGLY suggests that it is an artifact of measurement, # this STRONGLY suggests that it is an artifact of measurement,
# i.e., stack frames pushed by the CPU profiler signal handler. # i.e., stack frames pushed by the CPU profiler signal handler.
@ -2976,7 +2977,7 @@ sub FetchDynamicProfile {
$url = sprintf("http://$profile_name" . "seconds=%d", $url = sprintf("http://$profile_name" . "seconds=%d",
$main::opt_seconds); $main::opt_seconds);
} }
$curl_timeout = sprintf("--max-time=%d", $curl_timeout = sprintf("--max-time %d",
int($main::opt_seconds * 1.01 + 60)); int($main::opt_seconds * 1.01 + 60));
} else { } else {
# For non-CPU profiles, we add a type-extension to # For non-CPU profiles, we add a type-extension to

View File

@ -51,8 +51,9 @@ var (
// Report as tests are run; default is silent for success. // Report as tests are run; default is silent for success.
chatty = flag.Bool("test.v", false, "verbose: print additional output") chatty = flag.Bool("test.v", false, "verbose: print additional output")
match = flag.String("test.run", "", "regular expression to select tests to run") match = flag.String("test.run", "", "regular expression to select tests to run")
memProfile = flag.String("test.memprofile", "", "after execution write the memory profile to the named file") memProfile = flag.String("test.memprofile", "", "write a memory profile to the named file after execution")
memProfileRate = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate") memProfileRate = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate")
cpuProfile = flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution")
) )
@ -141,10 +142,16 @@ func tRunner(t *T, test *InternalTest) {
// An internal function but exported because it is cross-package; part of the implementation // An internal function but exported because it is cross-package; part of the implementation
// of gotest. // of gotest.
func Main(matchString func(pat, str string) (bool, os.Error), tests []InternalTest) { func Main(matchString func(pat, str string) (bool, os.Error), tests []InternalTest, benchmarks []InternalBenchmark) {
flag.Parse() flag.Parse()
before() before()
RunTests(matchString, tests)
RunBenchmarks(matchString, benchmarks)
after()
}
func RunTests(matchString func(pat, str string) (bool, os.Error), tests []InternalTest) {
ok := true ok := true
if len(tests) == 0 { if len(tests) == 0 {
println("testing: warning: no tests to run") println("testing: warning: no tests to run")
@ -177,7 +184,6 @@ func Main(matchString func(pat, str string) (bool, os.Error), tests []InternalTe
print(t.errors) print(t.errors)
} }
} }
after()
if !ok { if !ok {
println("FAIL") println("FAIL")
os.Exit(1) os.Exit(1)
@ -190,20 +196,36 @@ func before() {
if *memProfileRate > 0 { if *memProfileRate > 0 {
runtime.MemProfileRate = *memProfileRate runtime.MemProfileRate = *memProfileRate
} }
if *cpuProfile != "" {
f, err := os.Open(*cpuProfile, os.O_WRONLY|os.O_CREAT|os.O_TRUNC, 0666)
if err != nil {
fmt.Fprintf(os.Stderr, "testing: %s", err)
return
}
if err := pprof.StartCPUProfile(f); err != nil {
fmt.Fprintf(os.Stderr, "testing: can't start cpu profile: %s", err)
f.Close()
return
}
// Could save f so after can call f.Close; not worth the effort.
}
} }
// after runs after all testing. // after runs after all testing.
func after() { func after() {
if *memProfile == "" { if *cpuProfile != "" {
return pprof.StopCPUProfile() // flushes profile to disk
} }
fd, err := os.Open(*memProfile, os.O_WRONLY|os.O_CREAT|os.O_TRUNC, 0666) if *memProfile != "" {
f, err := os.Open(*memProfile, os.O_WRONLY|os.O_CREAT|os.O_TRUNC, 0666)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "testing: can't open %s: %s", *memProfile, err) fmt.Fprintf(os.Stderr, "testing: %s", err)
return return
} }
if err = pprof.WriteHeapProfile(fd); err != nil { if err = pprof.WriteHeapProfile(f); err != nil {
fmt.Fprintf(os.Stderr, "testing: can't write %s: %s", *memProfile, err) fmt.Fprintf(os.Stderr, "testing: can't write %s: %s", *memProfile, err)
} }
fd.Close() f.Close()
}
} }