Go 性能优化

评估性能

Benchmark

go test -bench=. -benchmem

性能优化建议

  • slice 预分配内存

    尽可能在使用make()初始化切片时提供容量信息

  • 场景

    • 原切片较大,代码在原切片基础上新建小写篇
    • 原底层数组在内存中引用,得不到释放

    建议使用copy替代re-slice

  • map预分配内存

    分析:

    • 不断向map中添加元素的操作会触发map的扩容
    • 提前分配好空间可以减少内存拷贝和rehash的消耗
    • 建议根据实际需求提前预估好需要的空间
  • 字符串处理使用strings.Builder

    分析:

    • go中的字符串类型是不可变类型,占用内存大小是固定的
    • 使用+每次都会重新分配内存
    • strings.Builder,bytes.Buffer底层都是[]byte数组
    • 内存扩容策略,不需要每次拼接重新分配内存
  • 使用空结构体节约内存

    空结构体struct{}不占据任何的内存空间

    空结构体本身具备很强的语义,即这里不需要任何值,仅作为占位符

    模拟set

  • 使用atomic包

    锁的实现是通过操作系统来实现,属于系统调用

    atomic操作是通过硬件实现,效率比锁高

    sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量

    对于非数值操作可使用atomic.Value,能承载一个interface{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值