超级苦工
阅读 144
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。

                                                                                                                                                                                   ——未完待续


请关注微信公众号:



评论
相关推荐
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年多没有更新了...

golang123报错问题

报图上错误,怎么解...

【开源】gnet: 一个轻量级且高性能的 Golang 网络库

Github 主页 https://github.com/panjf2000/gnet 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和...

t2

tttttttttttttttttttttttt...

test

123456789...

读 "优雅关闭的 Go Web 服务器"

读 "优雅关闭的 Go Web 服务器" GitHub 仓库:https://github.com/stayfoo/stayfoo-hub 文章《优雅的关闭 Go Web 服务器》...

golang123监控安装配置

有问题同学将golang123的源码中的statsD安装配置成功的,分享一下配置过程呗。...

Golang Modules官方包管理

1 设置环境变量 GO111MODULE=auto2 初始化项目 go mod init my_project3 针对国外无法访问的包设置代理 GOPROXY=https://goproxy.io其他...

猎豹移动,直播业务,招聘 Golang 工程师【北京】

我的微信是 legenove, 邮箱是 liuguoyang@cmcm.com 我是这个团队的 leader,直接给自己团队招聘。 职位要求: 1.熟练掌握 Golang 语言,并有 2 年以上中大型...

部署后登录 Request failed with status code 404

Request failed with status code 404 怎么解决...

[深圳 梦享网路 ] Golang开发工程师招聘

岗位介绍 ** 如有意向:请联系: 陈小姐:TEL:18620870779 邮箱:chenpeiwen@clickwifi.net ** 办公地点:深圳市南山区软件产业基地科园路中科纳能大厦A栋403...

golang + qt5 开发的百度网盘不限速客户端

百度网不限速客户端,使用golang + qt5 开发,跨平台。代码注释详细,并有附有开发文档,gopher们快来支持下吧 官网: https://github.com/peterq/pan-ligh...