Go: 字符串和转换优化

栏目: IT技术 · 发布时间: 3年前

内容简介::information_source:在Go中,将字节数组转换为字符串可能会涉及到内存分配以及转换后的字符串的副本。但是,仅将字节转换为字符串以满足代码约束(例如switch语句中的比较或作为map的key)绝对是浪费CPU时间。让我们回顾一些案例并进行优化。从字节数组转换为字符串涉及:

:information_source: 本文基于 Go 1.14。

在Go中,将字节数组转换为字符串可能会涉及到内存分配以及转换后的字符串的副本。但是,仅将字节转换为字符串以满足代码约束(例如switch语句中的比较或作为map的key)绝对是浪费CPU时间。让我们回顾一些案例并进行优化。

转换

从字节数组转换为字符串涉及:

  • 如果变量超过当前栈帧,则在堆上分配新字符串。

  • 转换后的字符串的副本。

这是完成这两个步骤的示例程序:

Go: 字符串和转换优化

这是转换的图示:

Go: 字符串和转换优化

在运行时,Go在转换期间仅提供一种优化。如果被转换的字节数组实际上只包含一个字节,则返回的字符串将指向运行时嵌入的静态字节数组:

Go: 字符串和转换优化

但是,如果以后修改此字符串,它将在分配新值之前从堆中分配内存。

Go编译器还提供了一些优化功能,可以跳过我们看到的转换的两个阶段。

Switch

让我们看一个用于比较意图的转换示例:

Go: 字符串和转换优化

这个例子用于说明字符串优化,将会通过 getBytes 函数强制在堆上分配。它避免了其他一些可能隐藏此处介绍的字符串优化的编译器优化。

在此示例中,转换仅用于 switch 比较,而Go可以避免转换,因为它只需要比较实际内容即可。Go实际上通过删除转换并直接指向背后的字节数组来优化代码:

Go: 字符串和转换优化

我们还可以看到生成的程序汇编的确切优化:

Go: 字符串和转换优化

Go直接在比较中使用返回的字节。它首先检查字节数组和case中字符串的长度然后再检查字符串本身。在 switch 之外进行字符串赋值将导致内存分配,因为编译器将不知道稍后在何处使用该字符串。

其他优化

switch 中并不是唯一适用于转换优化的情况。Go编译器同时将此行为应用于其他情况,例如:

  • 访问map元素。这是一个例子:

Go: 字符串和转换优化

访问map时,实际上不需要进行任何转换即可加快访问速度。

  • 字符串比较。这是一些例子:

Go: 字符串和转换优化

这种情况和 switch 类似。它首先比较字符串和字节数组的长度,然后对比字符串。

编译整理自 Go: String & Conversion Optimization

https://medium.com/a-journey-with-go/go-string-conversion-optimization-767b019b75ef

Go: 字符串和转换优化


以上所述就是小编给大家介绍的《Go: 字符串和转换优化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

社群营销与运营/互联网+新媒体营销规划丛书

社群营销与运营/互联网+新媒体营销规划丛书

秦阳//秋叶|总主编:秋叶 / 人民邮电出版社 / 2017-5 / 45.00元

《社群营销与运营》共分6章。第1章重点介绍了社群营销的起因、概念、构成、价值和评估模型,引导读者全面认识社群以及社群营销;第2章介绍了如何从无到有、从小到大建设一个社群的手法和注意事项;第3章重点介绍维持社群活跃度的各种技巧;第4章介绍了组织一场社群线下活动五个阶段的执行方案;第5章介绍了如何从无到有、由弱到强地构建社群运营团队;第6章介绍如何正确看待社群商业变现以及社群商业变现的三大模式和四个基......一起来看看 《社群营销与运营/互联网+新媒体营销规划丛书》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具