历览千载书,时时见遗烈。这篇文章主要讲述一个博文引起代码优化的思路相关的知识,希望能为你提供帮助。
- 参考博文:一步步提升Go语言生成随机字符串的效率
- 【一个博文引起代码优化的思路】根据自己的理解写出来的性能测试函数:
package generateStringimport(
"
time"
"
testing"
"
math/rand"
)var letterRunes = []rune("
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
)
const letterBtyes = "
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const letterIdxBits = 6
const letterIdxMask = 1 <
<
letterIdxBits -1
const letterIdxMax = 63 /letterIdxBits
var src = https://www.songbingjia.com/tech/rand.NewSource(time.Now().UnixNano())func init(){
rand.Seed(time.Now().UnixNano())
}// 常见做法
func RandStringRunes(n int) string {
b := make([]rune,n)
for i:= range b{
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}// bytes改进
func RandStringByte(n int) string{
b := make([]byte,n)
for i := range b{
b[i] = letterBtyes[rand.Intn(len(letterBtyes))]
}
return string(b)
}// 余数改进
func RandStringByteRmndr(n int)string{
b := make([]byte,n)
for i:= range b{
b[i] = letterBtyes[rand.Int63()%int64(len(letterBtyes))]
}
return string(b)
}// 掩码
func RandStringByteMask(n int)string{
b := make([]byte,n)
for i:=0;
i<
n;
{
// &
按位与
if idx := int(rand.Int63()&
letterIdxMask);
idx <
len(letterBtyes){
b[i] = letterBtyes[idx]
i++
}
}
return string(b)
}// 掩码改进,保证公平性的利用资源
func RandStringByteMaskImpr(n int)string{
b := make([]byte,n)
for i,cache,remain := n-1,src.Int63(),letterIdxMax;
i>
=0;
{
if remain==0{
cache,remain = src.Int63(),letterIdxMax
}
if idx := int(cache &
letterIdxMask);
idx <
len(letterBtyes) {
b[i] = letterBtyes[idx]
i--
}
cache >
>
= letterIdxBits//可以移动十次
remain--//修改十次
}
return string(b)
}func BenchmarkRandStringRunes(b *testing.B){
for i:=0;
i<
b.N;
i++{
RandStringRunes(5)
}
}func BenchmarkRandStringBytes(b *testing.B){
for i:=0;
i<
b.N;
i++{
RandStringByte(5)
}
}func BenchmarkRandStringByteRmndr(b *testing.B){
for i:=0;
i<
b.N;
i++{
RandStringByteRmndr(5)
}
}func BenchmarkRandStringByteMask(b *testing.B){
for i:=0;
i<
b.N;
i++{
RandStringByteMask(5)
}
}// 这部分缩短的时间太多了吧
func BenchmarkRandStringByteMaskTmpr(b *testing.B){
for i:=0;
i<
b.N;
i++{
RandStringByteMaskImpr(5)
}
}
- 输出结果
goos: windows
goarch: amd64
BenchmarkRandStringRunes-85756960219 ns/op40 B/op2 allocs/op
BenchmarkRandStringBytes-88533357146 ns/op10 B/op2 allocs/op
BenchmarkRandStringByteRmndr-89865086125 ns/op10 B/op2 allocs/op
BenchmarkRandStringByteMask-88979186141 ns/op10 B/op2 allocs/op
BenchmarkRandStringByteMaskTmpr-82004302561.9 ns/op10 B/op2 allocs/op
PASS
okcommand-line-arguments7.266s
- 优化代码的思路
- 要拥有的工具:学会使用go test中性能测试
- 通过使用性能测试工具,找到耗时的地方
- 内存资源尽可能多的利用
推荐阅读
- 高并发下的批量处理与单个处理(利用jdk8新特性处理,提高性能)
- 一道短小精悍的JS小题目
- 构建一个简单的Spring Boot项目
- 管道符
- Intel推出两款新处理器路线图公布
- 浅谈软件工程个人规划
- 给定一个只包含字符’(’,’)’,’{’,’}’,’[‘和’]'的字符串,判断输入字符串是否有效
- 数字通信之信源编码信道编码调制
- 合并EXCEL文件到一个文件的V宏