Day9-高质量编程2 & 性能优化 | 青训营笔记

92 阅读1分钟

“这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天”

1.3 性能优化

  • 性能优化是综合评估,时间效率和空间效率可能对立;

1.3.1 Benchmark

  • Go语言提供了支持基准性能测试的benchmark工具;

  • benchmem表示统计内存信息;

image.png

image.png

1.3.2 slice

  • slice 预分配内存,动态数组(存在动态扩容机制)

image.png

  • slice本质是一个数组片段的描述;

image.png

  • slice切片,不会释放大内存;不如copy

image.png

1.3.3 map

  • map预分配内存

  • 1 )不断向map中添加元素的操作会触发map扩容;

  • 2 )提前分配好空间可以减少内存拷贝和rehash的消耗;

  • 3 )建议提前根据实际需求预估好需要的空间;

image.png

1.3.4 字符串处理

  • 使用strings.Builder进行字符串拼接,效率更高;

image.png

  • 字符串在go语言中是不可变类型,占用内存大小是固定的;

  • 每次+都会重新分配内存;

image.png

  • string.Builder和bytes.Buffer底层都是[]byte数组;

image.png

1.3.5 空结构体

  • 空结构体本身具有很强的语义,不需要任何值,仅作为占位符;

  • 空结构体是节省内存空间的一个手段;

image.png

image.png

1.3.6 atomic包

  • 变量自带锁,

image.png image.png

  • 小结
  • 1 )避免常见的性育陷阱可以保证大部分程序的性能;
  • 2 )普通应用代码,不要一味地追求程序的性能;
  • 3 )越高级的性能优化手段越容易出现问题;
  • 4 )在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能;