go

Go 系列 高效编程

Posted by lichao modified on November 28, 2021

工具

  • 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
  • 大小端

高级技术

Runtime库

  • 函数、类函数、接口实现;cpu开销
  • 函数内联
  • 类型转换机制以及开销
    • runtime.convT2E
    • runtime.convT2I
  • type assertions vs. type switches
  • defer使用场景
    • defer机制(LIFO)
    • defer开销
    • 热点代码禁止使用defer
    • for循环禁止使用defer
  • map
  • 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

可替换的标准库

系统架构、业务优化

  • 系统架构
    • 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