]> Cypherpunks.ru repositories - gostls13.git/commit
runtime: implement GODEBUG=inittrace=1 support
authorMartin Möhrmann <moehrmann@google.com>
Mon, 14 Sep 2020 14:55:34 +0000 (16:55 +0200)
committerMartin Möhrmann <moehrmann@google.com>
Wed, 14 Oct 2020 05:34:32 +0000 (05:34 +0000)
commit7c58ef732efd9bf0d0882bb95371ce1909924a75
treef2e241a40bc5ac1ee70aabd31430fb03cfbc7f73
parentf46a5b1e4559191363dbd4f510105dd31ae97aaa
runtime: implement GODEBUG=inittrace=1 support

Setting inittrace=1 causes the runtime to emit a single line to standard error for
each package with init work, summarizing the execution time and memory allocation.

The emitted debug information for init functions can be used to find bottlenecks
or regressions in Go startup performance.

Packages with no init function work (user defined or compiler generated) are omitted.

Tracing plugin inits is not supported as they can execute concurrently. This would
make the implementation of tracing more complex while adding support for a very rare
use case. Plugin inits can be traced separately by testing a main package importing
the plugins package imports explicitly.

$ GODEBUG=inittrace=1 go test
init internal/bytealg @0.008 ms, 0 ms clock, 0 bytes, 0 allocs
init runtime @0.059 ms, 0.026 ms clock, 0 bytes, 0 allocs
init math @0.19 ms, 0.001 ms clock, 0 bytes, 0 allocs
init errors @0.22 ms, 0.004 ms clock, 0 bytes, 0 allocs
init strconv @0.24 ms, 0.002 ms clock, 32 bytes, 2 allocs
init sync @0.28 ms, 0.003 ms clock, 16 bytes, 1 allocs
init unicode @0.44 ms, 0.11 ms clock, 23328 bytes, 24 allocs
...

Inspired by stapelberg@google.com who instrumented doInit
in a prototype to measure init times with GDB.

Fixes #41378

Change-Id: Ic37c6a0cfc95488de9e737f5e346b8dbb39174e1
Reviewed-on: https://go-review.googlesource.com/c/go/+/254659
Trust: Martin Möhrmann <moehrmann@google.com>
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
doc/diagnostics.html
src/runtime/extern.go
src/runtime/malloc.go
src/runtime/proc.go
src/runtime/runtime1.go
src/runtime/symtab.go