工具
- pprof
- Go 工具pprof
- 会看 pprof 各个数据指标;火焰图
- 内存选项:
- -inuse_space
- -inuse_objects
- -alloc_space
- -alloc_objects
- http 接口
- net/HTTP/pprof
- 编写 benchmark
- -cpuprofile/-memprofile/-benchmem
系统级 trace
- gperf
- perf
- pstack
- strace
- tcpdump
GC机制
- 堆、栈分配区别
- 栈扩容机制;管理开销
- go栈、cgo栈
- 内存分配模型
- 对齐方式
- 填充方式
- 内存逃逸
- 内存池使用
- sync.Pool
- 手动管理
- gc
- 减少内存碎片
- 降低内存使用
- 切片与偏移量:当GC运行时指针写入需要writebarrier
- 大小端
高级技术
- CPU缓存
- cache-line:大小,填充,对齐
- 伪共享false-sharing
- 分片技术
- cache-miss工具
- 分支预测
- 从内部循环中删除分支: if a { for { } } else { for { } } 代替 for { if a { } else { } }
- 避免
- if i % 2 == 0 { evens++ } else { odds++ }
- counts[i & 1] ++并不总是更快
- 使用更好的汇编代码,代替原生
- https://github.com/buptbill220/gooptlib/blob/master/gooptlib/math.go
- 排序数据可以通过缓存局部性和分支预测来帮助提高性能。
- 数据结构设计考虑缓存局部性
- 函数调用开销
- 整数、浮点数转化
- gpu加速
- opengl -> https://medium.com/@drgomesp/opengl-and-golang-getting-started-abcd3d96f3db
- shader编程
- cuda
Runtime库
- 函数、类函数、接口实现;cpu开销
- 函数内联
- 类型转换机制以及开销
- runtime.convT2E
- runtime.convT2I
- type assertions vs. type switches
- defer使用场景
- defer机制(LIFO)
- defer开销
- 热点代码禁止使用defer
- for循环禁止使用defer
- map
- map底层机制
- 读写速度
- map、for slice对比、switch性能对比
- 更快的map -> https://github.com/buptbill220/gooptlib/tree/master/gooptlib/fmmap
- io模型
- epoll
- schedule
- mutex、rwmutex、atomic
- 底层实现
- 开销
- 无锁实现
标准库
- 字符串
- string、[]byte区别;以及转换开销
- byte、rune区别
- timer
- time.Sleep、time.Ticker、time.After、runtime.usleep、runtime.Osyield、runtime.Gosched区别以及性能
- time、runtime.nanotime区别
- timer性能;极限个数
- rand
- 实现机制
- 性能开销
- 不同rand场景
- 数组边界检查开销
- []byte <=> string
- fmt、strconv区别;性能开销
- so调用
- bytes.Buffer
- copy、append机制
- 排序
- sort.Sort和最小堆效率
- for、goto效率
- map、switch效率
- 指针和结构使用场景
- 更快的sqrt -> https://github.com/buptbill220/gooptlib/blob/master/gooptlib/math.go
- make提前给出空间大小
- hash函数选择
- 系统默认aes
- bkdr
- murmurhash
-
elf
CGO
- cgo如何调用
- c调用go
- go调用c
- Golang对routine、cgo栈管理区别
- 参数传递规则
汇编
- 体系架构
- amd64
- arm
- 386
- mips
- plan9汇编
- 汇编、go代码相互调用
- 堆栈管理分配
- 特殊指令优化
- sse4
- avx
- avx2
- avx512
- aes
- 方便的汇编工具:asmfmt,peachpy,c2goasm -> https://github.com/buptbill220/goasm
unsafe包
- 使用场景&危险
- 基础结构和reflect结构转换
- string -> stringheader
- []int -> sliceheader
- map -> hmap
- iterface -> iface
- iterface{func} -> eface
- offset、align用法
- mmap
并发编程
- goroutine模型使用场景,优缺点
- goroutine调度开销
- channel实现方式
- channel和mutex区别
- 多线程共享安全性
- goroutine池
- goroutine id获取
- 调用栈数据共享实现
- context机制
- channel leak
可替换的标准库
- encoding/json -> github.com/json-iterator/go
- net/http -> fasthttp
- regexp -> ragel
- protobuf -> gogoproto
- encoding/gob -> https://github.com/alecthomas/go_serialization_benchmarks
系统架构、业务优化
- 系统架构
- smp、amp、numa
- io、cpu任务拆分
- 系统分层、中心调度简单化
- 多机房部署、跨机房访问
- 数据分片,多片部署
- 存储
- 业务优化
- 业务流程
- 数据结构设计
- 算法选型
参考
https://github.com/dgryski/go-perfbook https://github.com/golang/go/wiki/CodeReviewComments https://golang.org/doc/effective_go.html https://github.com/buptbill220/gooptlib/tree/master/ https://github.com/buptbill220/goasm/tree/master/ 内核&优化专栏: https://zhuanlan.zhihu.com/c_1022784432553529344