go tool compile -S -N -l main.go //生成main.o中间文件 go tool link -v -o main main.o //生成可执行文件
go test -bench=. -benchmem
go test -bench=. -benchmem -memprofile=mem.out
go test -bench=. -benchmem -cpuprofile=cpu.out
生成的CPU、内存文件可以通过go tool pprof [file]进行查看,然后在pprof中通过list [file]方法查看CPU、内存的耗时情况 go tool pprof mem.out list BenchmarkRemoveDuplicatesInPlace
File: gotest.test Type: alloc_space Time: May 2, 2022 at 12:34pm (CST) Entering interactive mode (type "help" for commands, "o" for options) (pprof) list BenchmarkRemoveDuplicatesInPlace Total: 358.31MB ROUTINE ======================== gotest.BenchmarkRemoveDuplicatesInPlace in /home/wsjcko/test/remove_test.go 0 356.30MB (flat, cum) 99.44% of Total . . 12: } . . 13: return s . . 14:} . . 15: . . 16:func BenchmarkRemoveDuplicatesInPlace(b *testing.B) { . 356.30MB 17: s := generateSlice() . . 18: b.ResetTimer() . . 19: for i := 0; i < b.N; i++ { . . 20: RemoveDuplicatesInPlace(s) . . 21: } . . 22:} (pprof)
go tool pprof cpu.out list BenchmarkRemoveDuplicatesInPlace
File: gotest.test Type: cpu Time: May 2, 2022 at 12:34pm (CST) Duration: 7.63s, Total samples = 7.52s (98.54%) Entering interactive mode (type "help" for commands, "o" for options) (pprof) list BenchmarkRemoveDuplicatesInPlace Total: 7.52s ROUTINE ======================== gotest.BenchmarkRemoveDuplicatesInPlace in /home/wsjcko/test/remove_test.go 0 7.44s (flat, cum) 98.94% of Total . . 12: } . . 13: return s . . 14:} . . 15: . . 16:func BenchmarkRemoveDuplicatesInPlace(b *testing.B) { . 260ms 17: s := generateSlice() . . 18: b.ResetTimer() . . 19: for i := 0; i < b.N; i++ { . 7.18s 20: RemoveDuplicatesInPlace(s) . . 21: } . . 22:} (pprof)
file main.go
main.go: C source, UTF-8 Unicode text
file main.o
current ar archive
file main
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
go build -x main.go 不需要生成可执行文件,只是单纯查看过程: go build -n main.go 不需要生成可执行文件,只是单纯查看过程,并执行程序 go run -x main.go
WORK=/tmp/go-build2682583105 mkdir -p $WORK/b001/ cat >$WORK/b001/importcfg << 'EOF' # internal import config packagefile fmt=/usr/local/go/pkg/linux_amd64/fmt.a packagefile math=/usr/local/go/pkg/linux_amd64/math.a packagefile math/rand=/usr/local/go/pkg/linux_amd64/math/rand.a packagefile reflect=/usr/local/go/pkg/linux_amd64/reflect.a packagefile sync=/usr/local/go/pkg/linux_amd64/sync.a packagefile time=/usr/local/go/pkg/linux_amd64/time.a packagefile runtime=/usr/local/go/pkg/linux_amd64/runtime.a EOF cd /home/wsjcko/test /usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/pkg.a -trimpath "$WORK/b001=>" -p main -complete -buildid UuhDfIDNdijc2Z6D33HK/UuhDfIDNdijc2Z6D33HK -goversion go1.18.1 -c=4 -nolocalimports -importcfg $WORK/b001/importcfg -pack ./main.go /usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/pkg.a # internal cp $WORK/b001/pkg.a /home/wsjcko/.cache/go-build/cf/cf74e201cdc567e629449b0a966daab4a2588aad12c8e39d512f2dd3affda4e6-d # internal cat >$WORK/b001/importcfg.link << 'EOF' # internal packagefile command-line-arguments=$WORK/b001/pkg.a packagefile fmt=/usr/local/go/pkg/linux_amd64/fmt.a packagefile math=/usr/local/go/pkg/linux_amd64/math.a packagefile math/rand=/usr/local/go/pkg/linux_amd64/math/rand.a packagefile reflect=/usr/local/go/pkg/linux_amd64/reflect.a packagefile sync=/usr/local/go/pkg/linux_amd64/sync.a packagefile time=/usr/local/go/pkg/linux_amd64/time.a packagefile runtime=/usr/local/go/pkg/linux_amd64/runtime.a packagefile errors=/usr/local/go/pkg/linux_amd64/errors.a packagefile internal/fmtsort=/usr/local/go/pkg/linux_amd64/internal/fmtsort.a packagefile io=/usr/local/go/pkg/linux_amd64/io.a packagefile os=/usr/local/go/pkg/linux_amd64/os.a packagefile strconv=/usr/local/go/pkg/linux_amd64/strconv.a packagefile unicode/utf8=/usr/local/go/pkg/linux_amd64/unicode/utf8.a packagefile internal/cpu=/usr/local/go/pkg/linux_amd64/internal/cpu.a packagefile math/bits=/usr/local/go/pkg/linux_amd64/math/bits.a packagefile internal/abi=/usr/local/go/pkg/linux_amd64/internal/abi.a packagefile internal/bytealg=/usr/local/go/pkg/linux_amd64/internal/bytealg.a packagefile internal/goarch=/usr/local/go/pkg/linux_amd64/internal/goarch.a packagefile internal/goexperiment=/usr/local/go/pkg/linux_amd64/internal/goexperiment.a packagefile internal/itoa=/usr/local/go/pkg/linux_amd64/internal/itoa.a packagefile internal/unsafeheader=/usr/local/go/pkg/linux_amd64/internal/unsafeheader.a packagefile unicode=/usr/local/go/pkg/linux_amd64/unicode.a packagefile internal/race=/usr/local/go/pkg/linux_amd64/internal/race.a packagefile sync/atomic=/usr/local/go/pkg/linux_amd64/sync/atomic.a packagefile syscall=/usr/local/go/pkg/linux_amd64/syscall.a packagefile internal/goos=/usr/local/go/pkg/linux_amd64/internal/goos.a packagefile runtime/internal/atomic=/usr/local/go/pkg/linux_amd64/runtime/internal/atomic.a packagefile runtime/internal/math=/usr/local/go/pkg/linux_amd64/runtime/internal/math.a packagefile runtime/internal/sys=/usr/local/go/pkg/linux_amd64/runtime/internal/sys.a packagefile runtime/internal/syscall=/usr/local/go/pkg/linux_amd64/runtime/internal/syscall.a packagefile internal/reflectlite=/usr/local/go/pkg/linux_amd64/internal/reflectlite.a packagefile sort=/usr/local/go/pkg/linux_amd64/sort.a packagefile internal/oserror=/usr/local/go/pkg/linux_amd64/internal/oserror.a packagefile internal/poll=/usr/local/go/pkg/linux_amd64/internal/poll.a packagefile internal/syscall/execenv=/usr/local/go/pkg/linux_amd64/internal/syscall/execenv.a packagefile internal/syscall/unix=/usr/local/go/pkg/linux_amd64/internal/syscall/unix.a packagefile internal/testlog=/usr/local/go/pkg/linux_amd64/internal/testlog.a packagefile io/fs=/usr/local/go/pkg/linux_amd64/io/fs.a packagefile path=/usr/local/go/pkg/linux_amd64/path.a modinfo "0w\xaf\f\x92t\b\x02A\xe1\xc1\a\xe6\xd6\x18\xe6path\tcommand-line-arguments\nbuild\t-compiler=gc\nbuild\tCGO_ENABLED=1\nbuild\tCGO_CFLAGS=\nbuild\tCGO_CPPFLAGS=\nbuild\tCGO_CXXFLAGS=\nbuild\tCGO_LDFLAGS=\nbuild\tGOARCH=amd64\nbuild\tGOOS=linux\nbuild\tGOAMD64=v1\n\xf92C1\x86\x18 r\x00\x82B\x10A\x16\xd8\xf2" EOF mkdir -p $WORK/b001/exe/ cd . /usr/local/go/pkg/tool/linux_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=6-9c_0F3RiX2QXgxBCOc/UuhDfIDNdijc2Z6D33HK/K7OTO8wVdJ6HriHnKgGu/6-9c_0F3RiX2QXgxBCOc -extld=gcc $WORK/b001/pkg.a /usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/exe/a.out # internal mv $WORK/b001/exe/a.out main rm -r $WORK/b001/
go run -work main.go
WORK=/tmp/go-build3129056699
go build -gcflags="-S" main.go
command-line-arguments
"".Do STEXT size=108 args=0x8 locals=0x18 funcid=0x0 align=0x0
0x0000 00000 (/home/wsjcko/test/main.go:9) TEXT "".Do(SB), ABIInternal, $24-8
0x0000 00000 (/home/wsjcko/test/main.go:9) CMPQ SP, 16(R14)
0x0004 00004 (/home/wsjcko/test/main.go:9) PCDATA
go tool objdump -S -s "Do" ./main go tool objdump -S main.o
go build -gcflags '-l' -o testmain . go tool objdump -s "main" main
go build -ldflags="-s -w" main.go