golang性能优化小技巧

Posted by [kohn] on Sunday, January 29, 2023
Last Modified on Monday, May 8, 2023
本文阅读量

1 正文

  1. struct{}在golang中不占用内存(怎么实现的得再研究下), 可以通过print sizeof(struct{})来确认. 这个特性可以用在利用map实现set功能上. 以往常用的是定义一个map[string]bool, bool类型虽然也很小, 但是占用了1字节不发送数据的channel
  2. fmt实现时用到了反射, 因此拼接字符串, 数字转字符串等操作尽量用”+”, strconv来代替
  3. golang通过编译器来决定一个变量的内存分配在栈上还是分配在堆上. 值传递虽然要拷贝, 但是如果是小对象的话是分配在栈上(<64KB), 而指针传递必须分配在堆上. 因此指针传递不一定就比值传递快. 通常只有对于需要修改原对象或者对象很大的情况下用指针传递. 而对于频繁创建删除或者对象很小的情况下用值传递
  4. 利用sync.Pool(内存池)存放频繁创建删除的对象

2 参考文档

https://dave.cheney.net/high-performance-go-workshop/dotgo-paris.html#overview