Спецификация языка программирования Go
Отложенные операторы
Оператор "defer" вызывает функцию, выполнение которой откладывается домомент, когда окружающая функция возвращается, либо потому, что окружающая функция выполнила оператор возврата, достигла конца тела своей функции, либо потому, что соответствующая процедура запаниковала.
Исправьте преждевременное закрытиефайл CPU:
func CPUprofiling() {
fd, err := os.Create(".cpu.prof")
if err != nil {
log.Fatalln(err.Error())
}
defer fd.Close()
pprof.StartCPUProfile(fd)
defer pprof.StopCPUProfile()
}
Например,
package main
import (
"bufio"
"flag"
"fmt"
"log"
"os"
"runtime/pprof"
"strings"
)
var filename string
func main() {
cpu, err := os.Create(".cpu.prof")
if err != nil {
log.Fatalln(err.Error())
}
defer cpu.Close()
pprof.StartCPUProfile(cpu)
defer pprof.StopCPUProfile()
flag.StringVar(&filename, "f", "", "Path to the input file")
flag.Parse()
if filename == "" {
flag.Usage()
log.Fatalln()
}
for w, c := range getResults(filename) {
fmt.Printf("%-20s\t%d\n", w, c)
}
mem, err := os.Create(".mem.prof")
if err != nil {
log.Fatalln(err.Error())
}
defer mem.Close()
pprof.WriteHeapProfile(mem)
}
func getResults(path string) map[string]int {
results := make(map[string]int)
file, err := os.Open(filename)
defer file.Close()
if err != nil {
log.Fatalln(err.Error())
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
for scanner.Scan() {
results[removeNonWordChars(scanner.Text())]++
}
delete(results, "")
return results
}
func removeNonWordChars(input string) string {
var result strings.Builder
result.Grow(len(input))
for _, r := range strings.ToLower(input) {
if r >= 'a' && r <= 'z' {
_, err := result.WriteRune(r)
if err != nil {
log.Fatalln(err.Error())
}
}
}
return result.String()
}
Вывод:
$ go tool pprof .cpu.prof
File: main
Type: cpu
Time: Oct 9, 2019 at 5:39am (EDT)
Duration: 600.79ms, Total samples = 390ms (64.91%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
Showing nodes accounting for 320ms, 82.05% of 390ms total
Showing top 10 nodes out of 43
flat flat% sum% cum cum%
110ms 28.21% 28.21% 110ms 28.21% syscall.Syscall
60ms 15.38% 43.59% 90ms 23.08% runtime.mapassign_faststr
40ms 10.26% 53.85% 40ms 10.26% unicode/utf8.DecodeRune
30ms 7.69% 61.54% 30ms 7.69% strings.(*Builder).WriteRune
20ms 5.13% 66.67% 20ms 5.13% runtime.slicebytetostring
20ms 5.13% 71.79% 20ms 5.13% strings.ToLower
10ms 2.56% 74.36% 60ms 15.38% bufio.ScanWords
10ms 2.56% 76.92% 10ms 2.56% bufio.isSpace
10ms 2.56% 79.49% 10ms 2.56% fmt.(*buffer).writeString
10ms 2.56% 82.05% 10ms 2.56% memeqbody
(pprof) quit
$