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:
parent
14b9032f84
commit
543acc97f9
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user