本文是对#102 Go 官方标准编译器中实现的优化集锦汇总 内容的记录与总结.
优化1-4: 字符串和字节切片之间的转化
1.紧跟range关键字的 从字符串到字节切片的转换;
1 | package main |
f没有开辟内存,g开辟了一次内存.
2.映射元素读取索引语法中被用做键值的 从字节切片到字符串的转换;
1 | package main |
3.字符串比较表达式中被用做比较值的 从字节切片到字符串的转换
1 | package main |
4.含 非空字符串常量 的字符串衔接表达式中的 从字节切片到字符串的转换
1 | package main |
5.[]rune(aString)转换的时间和空间复杂度都是O(n),但len([]rune(aString))中的此转换 不需要开辟内存
Go 1.12引入
1 | package main |
6.字符串衔接表达式只需开辟一次内存,无论需要衔接多少个字符串
1 | package main |
7.for i := range anArrayOrSlice{anArrayOrSlice[i]} = zeroElement} 形式 将被优化为一个内部的memclr操作
1 | package main |
benchmark:
1 | package main |
执行结果:
1 | goos: darwin |
8.for k = range m {delete(m,k)}形式 将被优化为一个内部的map清空操作
9.尺寸不大于4个原生字(即int),并且字段数不超过4个的结构体值被视为是小尺寸值
1 | package main |
benchmark:
1 | package main |
执行结果:
1 | goos: darwin |
因为很多一等公民,其底层结构体的元素,都没有超过4个
10.接口值包裹 指针值 比 包裹 其他类型的值 要快
1 | package main |
1 | package main |
1 | goos: darwin |
11.接口值包裹 指针值 比 包裹 其他类型的值 要快
Go 1.15新增优化
1 | package main |
1 | package main |
1 | goos: darwin |
12.Bounds Check Elimination
原文链接: https://dashen.tech/2021/06/07/Go-官方标准编译器中所做的优化/
版权声明: 转载请注明出处.