Asjdf

一只在杭电摸鱼的小火鸡

Golang 性能调优速查笔记

2023-07-24 大约430字 预计阅读1分钟

# 技巧

  • unsafe转换字符串/字节切片的技巧
    • 字符串 -> 字节切片:*(*[]byte)(unsafe.Pointer(&s))
      • 缓冲区不能修改,否则 go 会panic!
    • 字节切片 -> 字符串:*(*string)(unsafe.Pointer(&buf))
  • 重用缓冲区
    • 复位缓冲器
      • bytes.Buffer.Reset
      • buf = buf[:0]
  • 尽可能直接分配所需大小的数组
  • 清空Map使用delete循环而不是新建map(编译器将会优化
    m = make(map[xxx]xxx)// 不要这么做
    
    for k := range m {// 请这么做
        delete(m, k)
    }
  • 在bool仅作为占位符的场景,使用空结构体代替bool以节约内存空间。
    • 不发送数据的信道(channel)
      func worker(ch chan struct{}) {
          <-ch
          fmt.Println("do something")
          close(ch)
      }
      
      func main() {
          ch := make(chan struct{})
          go worker(ch)
          ch <- struct{}{}
      }
    • 仅仅包含方法的类型
      type Door struct{}
      
      func (d Door) Open() {
          fmt.Println("Open the door")
      }
      
      func (d Door) Close() {
          fmt.Println("Close the door")
      }
    • 在建立集合等场景,使用空结构体struct{}代替bool,例:
      type Set map[string]struct{}
      
      func (s Set) Has(key string) bool {
          _, ok := s[key]
          return ok
      }
      
      func (s Set) Add(key string) {
          s[key] = struct{}{}
      }
      
      func (s Set) Delete(key string) {
          delete(s, key)
      }
      
      func main() {
          s := make(Set)
          s.Add("foo")
          s.Add("bar")
          fmt.Println(s.Has("foo"))
          fmt.Println(s.Has("bar"))
      }
  • 在内存敏感的场景下可以通过合理布局结构体,优化内存对齐以优化性能。
闽ICP备2022001901号-1 公安网备图标闽公网安备35030302354429号

主题 atom-hugo-theme