知识点
- 编码
- golang 默认编码是
utf-8
; - golang 中
string
底层是通过byte数组
实现的; - 中文字符在unicode下占2个字节,在utf-8编码下占3个字节;
- golang 默认编码是
- 基础数据类型
rune
数据类型是int32
的别名,常用来处理unicode或utf-8字符,例如汉字的长度使用len([]rune("你好"))
;byte
数据类型是uint8
的别名,常用来处理ascii字符
rand
包实现了用于加解密的更安全的随机数生成器rand.Seed(time.Now().UnixNano())
设置随机种子rand.NewSource(time.Now().UnixNano())
Intn()
Int63()
strings
包实现了用于操作字符的简单函数strings.Builder
WriteByte()
String()
结论
- 如果字符串是英文字母大小写,可以用
byte
代替rune
,速度提升 22% ,内存分配减少了 67% - 用
rand.Int63()
代替rand.Intn()
速度提升 21% - 使用位运算性能下降了 22% ,但是充分利用
rand.Int63()
速度可提升 3 倍 - 使用
rand.Source()
代替rand.Rand()
速度提升 17% - 使用
strings.Builder
速度提升不大,但是内存分配减少 50% - 使用
unsafe
代替strings.Builder
速度提升 14% - 优化到最后,与第一个生成随机字符串的方法对比可发现速度提升了 6 倍,内存分配减少了 83%
1 | goos: darwin |
随机生成固定长度字符串方法
random.go 文件
以下代码来自于参考链接
1 | package main |
基准测试代码
新建
random_test.go
文件,执行测试命令go test -benchmem study/cmd -bench .
以下代码来自于参考链接
1 | package main |