博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go性能优化技巧 1/10
阅读量:7251 次
发布时间:2019-06-29

本文共 1418 字,大约阅读时间需要 4 分钟。

  hot3.png

字符串(string)作为一种不可变类型,在与字节数组(slice, [ ]byte)转换时需付出 “沉重” 代价,根本原因是对底层字节数组的复制。这种代价会在以万为单位的高并发压力下迅速放大,所以对它的优化常变成 “必须” 行为。

首先,须了解 string 和 [ ]byte 数据结构,并确认默认方式的复制行为。

package mainimport (	"fmt")func main() {	s := "hello, world!"	b := []byte(s)	fmt.Println(s, b)}

动态演示: https://asciinema.org/a/6up6gvgqo0v9zkjpusvyucg8g

从 GDB 输出结果可看出,转换后 [ ]byte 底层数组与原 string 内部指针并不相同,以此可确定数据被复制。那么,如不修改数据,仅转换类型,是否可避开复制,从而提升性能?

从 ptype 输出的结构来看,string 可看做 [2]uintptr,而 [ ]byte 则是 [3]uintptr,这便于我们编写代码,无需额外定义结构类型。如此,str2bytes 只需构建 [3]uintptr{ptr, len, len},而 bytes2str 更简单,直接转换指针类型,忽略掉 cap 即可。

package mainimport (	"fmt"	"strings"	"unsafe")func str2bytes(s string) []byte {	x := (*[2]uintptr)(unsafe.Pointer(&s))	h := [3]uintptr{x[0], x[1], x[1]}	return *(*[]byte)(unsafe.Pointer(&h))}func bytes2str(b []byte) string {	return *(*string)(unsafe.Pointer(&b))}func main() {	s := strings.Repeat("abc", 3)	b := str2bytes(s)	s2 := bytes2str(b)	fmt.Println(b, s2)}

用 unsafe 完成指针类型转换,所以得自行为底层数组生命周期做出保证。好在这两个函数都很简单,编译器会完成内联处理,并未发生逃逸行为。

对比一下优化前后的性能差异。

package mainimport (	"strings"	"testing")var s = strings.Repeat("a", 1024)func test() {	b := []byte(s)	_ = string(b)}func test2() {	b := str2bytes(s)	_ = bytes2str(b)}func BenchmarkTest(b *testing.B) {	for i := 0; i < b.N; i++ {		test()	}}func BenchmarkTestBlock(b *testing.B) {	for i := 0; i < b.N; i++ {		test2()	}}

性能提升明显,最关键的是 zero-garbage。

最新动态,请扫码关注

转载于:https://my.oschina.net/qyuhen/blog/666135

你可能感兴趣的文章
栅格布局
查看>>
Zimber 8.8.12卸载后重新安装报错解决办法
查看>>
Git 自救指南
查看>>
spring boot配置项目访问路径,配置拦截器,配置静态虚拟路径
查看>>
linux运维笔记
查看>>
Lake Counting (DFS)
查看>>
信息安全影响因素
查看>>
hadoop安装
查看>>
delegate事件委托
查看>>
Linux Process VS Thread VS LWP
查看>>
杭电多校第二场 1005 hack it
查看>>
VMM2012应用指南之9-向VMM中添加VMware ESX Server主机
查看>>
Exchange日常管理之二十二:配置保留策略
查看>>
Android -- Webview自适应屏幕
查看>>
从Delphi 7升级到Delphi XE
查看>>
android圆形图像
查看>>
Oracle数据库备份还原工具之Expdp/IMPdp
查看>>
【转】android JNI编程 一些技巧(整理)
查看>>
MySQL之终端(Terminal)管理数据库、数据表、数据的基本操作
查看>>
各种排序算法汇总
查看>>