gcflags 逃逸分析等

最后更新于:2022-04-02 02:51:18

[TOC] ## 格式 其实是给go tool compile 的参数, 查看文档:`go tool compile —help` ``` -gcflags ‘[pattern=]arg list’: -%: 调试非静态初始化器(debug non-static initializers) -+:编译 go runtime -B:禁用边界检查 -C:禁用错误消息中的列打印 -D path:设置local import的相对路径 -E 调试符号表导出 -I directory:添加 import的搜索路径 -K:调试缺少的行号 -L:在错误消息中显示文件的全路径 -N:禁止编译优化 -S:打印汇编码 -V:打印版本号并退出 -W:类型检查之后调试解析树 -asmhdr file:把汇编头(assemply header)写进文件file -bench file:把benchmark时间添加到文件file -blockprofile file:把 阻塞(block) profile信息写进文件file -buildid id: 设置构建ID,写进导出的元信息中 (record id as the build id in the export metadata) -c int:指定编译时期的并发数量,1表示无并发(默认是1) -complete:编译完整的软件包(无C和汇编代码) -cpuprofile file: 写 cpu profile到file -d list: 打印列表中iterm的调试信息(debug information about items in list) -dwarf: 生成 DWARF符号(默认开启) -dwarfbasentries:使用DWARF中的基地址选择条目(use base address selection entries in DWARF) -dwarflocationlists:在优化模式下将位置列表添加到DWARF(默认开启) -dynlink: 引用在其他go 共享库里定义的符号 -e:显示详细错误信息,不限制错误信息行数 -gendwarfinl int:生成DWARF内联信息记录(默认是 2) -goversion string: 所需的运行时版本 -h:在遇到错误时停止 -importcfg file:从file中读取import配置信息 -importmap definition:添加source=actual形式的定义到 import map -installsuffix suffix: 设置 pkg目录前缀 -j:调试运行时初始化的(runtime-initialized)变量。 -l:禁止内联 -gcflags=-l: 禁止内联 不指定该选项: 开启一般的内联优化 -gcflags=’-l -l’: 开启level 2的内联优化,内联优化更加激进,有可能能优化目标文件执行速度,也有可能生成更大的二进制文件。 -gcflags=’-l -l -l’: 开启level3的内联优化,更加更加激进,目标文件可能执行的更快,一定会生成更大的二进制文件,而且还可能引入bug。 -gcflags=-l=4(4个l), Go 1.11中将开启处于试验阶段的mid-stack inlining优化。 -lang string: release to compile for -linkobj file:将链接器特定的对象写入文件file -live: 调试活性(liveness)分析 -m:打印优化决策 -memprofile file:将memory profile写入文件file -memprofilerate rate:设置runtime.MemProfileRate为rate -mutexprofile file: 将mutex profile写入文件file -newescape: 开启 new escape分析(默认开启),具体含义参考上面编译优化部分“逃逸分析”。 -nolocalimports: 禁止本地(相对)路径import -o file: 将生成的目标文件写到file -p path: 设置包导入路径 -pack:构建目标文件成 .a文件而非.o文件 -r: 调试生成的包装器 -race: 开启竞态检测 -s: 警告可以简化的复合文字 -shared: 生成共享库 -smallframes:减小栈分配对象的大小上限 -std: 编译标准库 -symabis file:从文件file读取ABIs符号信息 -traceprofile file: 将执行trace信息写入文件file -trimpath prefix: 从记录的源代码文件中删除 prefix文件路径前缀 -v: 增加显示调试信息的详细程度 -w: 调试类型检查 -wb: 启用写屏障(默认开启) ``` ## 参数 ## gcflags=-m 进行逃逸分析 ``` // main_pointer.go package main import "fmt" type Demo struct { name string } func createDemo(name string) *Demo { d := new(Demo) // 局部变量 d 逃逸到堆 d.name = name return d } func main() { demo := createDemo("demo") fmt.Println(demo) } ``` 结果 ``` $ go build -gcflags=-m main_pointer.go ./main_pointer.go:10:6: can inline createDemo ./main_pointer.go:17:20: inlining call to createDemo ./main_pointer.go:18:13: inlining call to fmt.Println ./main_pointer.go:10:17: leaking param: name ./main_pointer.go:11:10: new(Demo) escapes to heap ./main_pointer.go:17:20: new(Demo) escapes to heap ./main_pointer.go:18:13: demo escapes to heap ./main_pointer.go:18:13: main []interface {} literal does not escape ./main_pointer.go:18:13: io.Writer(os.Stdout) escapes to heap :1: (*File).close .this does not escape ```
';