知识点
- 编码
- 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.BuilderWriteByte()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 |