[转载]Go 语言字符串 string 与字符数组 []byte 高效转换

转载自:https://www.cnblogs.com/shuiyuejiangnan/p/9707066.html

string 与 []byte 的直接转换是通过底层数据 copy 实现的,

这种操作在并发量达到十万百万级别的时候会拖慢程序的处理速度。

通过 gdb 调试来看一下 string 和 []byte 的数据结构:

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

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

通过 unsafe.Pointer(指针转换)和 uintptr(指针运算)实现转换:

没有出现逃逸现象。

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

没有额外开辟内存:0B/op,执行效率:5 亿次耗时 1.6 秒;而不用 unsafe.Pointer 和 uintptr 转换 300 次耗时就达到了 1.1 秒,效率对比高下立判。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注