Go性能优化技巧1/10
2016-07-12 00:00
120 查看
字符串(string)作为一种不可变类型,在与字节数组(slice, [ ]byte)转换时需付出 “沉重” 代价,根本原因是对底层字节数组的复制。这种代价会在以万为单位的高并发压力下迅速放大,所以对它的优化常变成 “必须” 行为。
首先,须了解 string 和 [ ]byte 数据结构,并确认默认方式的复制行为。
动态演示: https://asciinema.org/a/6up6gvgqo0v9zkjpusvyucg8g
从 GDB 输出结果可看出,转换后 [ ]byte 底层数组与原 string 内部指针并不相同,以此可确定数据被复制。那么,如不修改数据,仅转换类型,是否可避开复制,从而提升性能?
从 ptype 输出的结构来看,string 可看做 [2]uintptr,而 [ ]byte 则是 [3]uintptr,这便于我们编写代码,无需额外定义结构类型。如此,str2bytes 只需构建 [3]uintptr{ptr, len, len},而 bytes2str 更简单,直接转换指针类型,忽略掉 cap 即可。
用 unsafe 完成指针类型转换,所以得自行为底层数组生命周期做出保证。好在这两个函数都很简单,编译器会完成内联处理,并未发生逃逸行为。
对比一下优化前后的性能差异。
性能提升明显,最关键的是 zero-garbage。
提示:仅在必要的时候做此优化!
首先,须了解 string 和 [ ]byte 数据结构,并确认默认方式的复制行为。
动态演示: https://asciinema.org/a/6up6gvgqo0v9zkjpusvyucg8g
从 GDB 输出结果可看出,转换后 [ ]byte 底层数组与原 string 内部指针并不相同,以此可确定数据被复制。那么,如不修改数据,仅转换类型,是否可避开复制,从而提升性能?
从 ptype 输出的结构来看,string 可看做 [2]uintptr,而 [ ]byte 则是 [3]uintptr,这便于我们编写代码,无需额外定义结构类型。如此,str2bytes 只需构建 [3]uintptr{ptr, len, len},而 bytes2str 更简单,直接转换指针类型,忽略掉 cap 即可。
用 unsafe 完成指针类型转换,所以得自行为底层数组生命周期做出保证。好在这两个函数都很简单,编译器会完成内联处理,并未发生逃逸行为。
对比一下优化前后的性能差异。
性能提升明显,最关键的是 zero-garbage。
提示:仅在必要的时候做此优化!
相关文章推荐
- Go性能优化技巧2/10
- Go 性能优化技巧 3/10
- Go 性能优化技巧 4/10
- Go 性能优化技巧 5/10
- Go 性能优化技巧 6/10
- Go 性能优化技巧 7/10
- Go 性能优化技巧 8/10
- HDU5546 Ancient Go DFS
- goldengate 学习有用网址
- GO的GDB调试
- 统一日志管理-Mongo 篇
- 大话设计模式(Golang) 二、策略模式
- Django开发环境的搭建
- golang学习之rpc实例
- 最新的黑客大杀器:Google Dorking
- mongoose
- Is it Google Hacking? It's Google Dorking
- 欢迎使用CSDN-markdown编辑器
- pycharm快捷键、配置virtualenv环境,配置django调试,配置远程调试
- Go语言_Go_Golang 逐行读取文件