改进随机数生成缓冲区

This commit is contained in:
John
2018-11-23 21:39:05 +08:00
parent 69738c337f
commit aa42ddd3f1
3 changed files with 50 additions and 6 deletions

View File

@ -9,6 +9,7 @@ package grand
import (
"crypto/rand"
"encoding/binary"
"time"
)
const (
@ -21,14 +22,34 @@ var (
// 使用缓冲区实现快速的随机数生成
func init() {
step := 0
buffer := make([]byte, 1024)
go func() {
for {
if n, err := rand.Read(buffer); err != nil {
panic(err)
} else {
for i := 0; i < n - 8; i += 8 {
// 使用缓冲区数据进行一次完整的随机数生成
for i := 0; i < n - 8; {
bufferChan <- binary.LittleEndian.Uint64(buffer[i : i + 8])
i ++
}
// 充分利用缓冲区数据,随机索引递增
step = int(time.Now().UnixNano()%10)
for i := 0; i < n - 8; {
bufferChan <- binary.LittleEndian.Uint64(buffer[i : i + 8])
i += step
}
// 充分利用缓冲区数据,字节倒序生成
for i := 0; i < n - 8; {
bufferChan <- binary.BigEndian.Uint64(buffer[i : i + 8])
i ++
}
// 充分利用缓冲区数据,字节倒序生成,随机索引递增
step = int(time.Now().UnixNano()%10)
for i := 0; i < n - 8; {
bufferChan <- binary.BigEndian.Uint64(buffer[i : i + 8])
i += step
}
}
}

View File

@ -9,12 +9,22 @@
package grand_test
import (
"testing"
"gitee.com/johng/gf/g/util/grand"
"testing"
)
var buffer = make([]byte, 8)
func Benchmark_Rand(b *testing.B) {
for i := 0; i < b.N; i++ {
grand.Rand(0, 999999999)
}
}
//func Benchmark_Buffer(b *testing.B) {
// for i := 0; i < b.N; i++ {
// if _, err := rand.Read(buffer); err == nil {
// binary.LittleEndian.Uint64(buffer)
// }
// }
//}

View File

@ -1,10 +1,23 @@
package main
import (
"fmt"
"gitee.com/johng/gf/g/os/gtime"
"gitee.com/johng/gf/g"
"gitee.com/johng/gf/g/net/ghttp"
)
func main() {
fmt.Println(gtime.Now())
}
s := g.Server()
s.BindHandler("/", func(r *ghttp.Request) {
})
s.BindHandler("/user", func(r *ghttp.Request) {
})
s.BindHandler("/user/:id", func(r *ghttp.Request) {
r.Response.Header().Set("Content-Type", "text/plain; charset=utf-8")
r.Response.Write(r.Get("id"))
})
s.SetFileServerEnabled(false)
s.SetPort(3000)
s.Run()
}