超级苦工
阅读 256
Go性能优化技巧 1/10

字符串(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。

                                                                                                                                                                                   ——未完待续


请关注微信公众号:



评论
相关推荐
阿斯蒂芬萨芬的

55522 function app() { echo 'sdfsdf';...

阿斯蒂芬萨芬的

55522 function app() { echo 'sdfsdf'; }...

浅谈Go类型转换之间的那些事

试着答一答这些问题 s[i]和(for _,v range)的v的区别是什么 var s string = "AB" fmt.Println(reflect.TypeOf(s[0]...

Kubernetes安装多master集群

...

MongoDB备份与还原

...

CentOS中安装mongo shell

添加官方 MongoDB 仓库 $ echo '[mongodb-org-4.0] name=MongoDB Repository baseurl=https://repo.mongodb.o...

很漂亮的页面啊不错不错啊

很漂亮的页面啊不错不错啊...

在Kubernetes中部署第一个应用程序

...

在阿里云的ECS中安装Kubernetes

...

从0到1使用Kubernetes系列(二)——安装工具介绍

...

从0到1使用Kubernetes系列——Kubernetes入门

...

asdfasfdfd

asdfasdfsafd...

asdfafsdfsad

function sdf(){ echo "sdffsdfds"; }...

阿萨德飞

sdflkllsfdkj nihao...

【Golang+mysql】记一次mysql数据库迁移(一)

【Golang+mysql】记一次mysql数据库迁移(一) 文章地址:https://github.com/stayfoo/stayfoo-hub 一、准备 目标: 腾讯云 CVM 自建 mysql...

米粒社区系统什么部署?

发现现在一些功能还没开发或上线,不过感觉这个社区系统很强大,期待期待...

不错的网站

ceshi ceshi...

[译]想成为一个出色的Web工程师?学Golang而非Node.js。

原文: https://medium.com/codezillas/want-to-be-a-best-web-developer-learn-golang-not-node-js-69b4166d1...

跟我一起学习gRPC

扫描二维码,点击源码阅读菜单,跟我一起学习gRPC...

这个项目还会更新吗

这个项目github上1年多没有更新了...