一个博文引起代码优化的思路

历览千载书,时时见遗烈。这篇文章主要讲述一个博文引起代码优化的思路相关的知识,希望能为你提供帮助。

  • 参考博文:一步步提升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中性能测试
    • 通过使用性能测试工具,找到耗时的地方
    • 内存资源尽可能多的利用

    推荐阅读