Skip to content

Commit 9af86e7

Browse files
committed
优化
1 parent d9fdc91 commit 9af86e7

File tree

3 files changed

+92
-25
lines changed

3 files changed

+92
-25
lines changed

util/random.go

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@ const (
1717
F_PRIME3 float32 = 30323
1818
)
1919

20+
type Rand interface {
21+
//并发不安全的随机0-1之间的小数(包括0不包括1)
22+
UniformFloat() float32
23+
//并发安全的随机0-1之间的小数(包括0不包括1)
24+
SyncUniformFloat() float32
25+
//并发不安全的随机min-max之间的小数(包括min和max)
26+
UniformInt(min int, max int) int
27+
//并发不安全的随机max-max之间的小数(包括min和max)
28+
SyncUniformInt(min int, max int) int
29+
}
30+
2031
type _rand struct {
2132
_mut sync.Mutex
2233
prime1 int
@@ -25,23 +36,21 @@ type _rand struct {
2536
}
2637

2738
var (
28-
_globalRand *_rand = Seed()
39+
_globalRand Rand = Seed()
2940
_globalSeed int
3041
_globalMut sync.Mutex
3142
)
3243

3344
//构造一个随机器
34-
func Seed() *_rand {
35-
_globalMut.Lock()
36-
addp := _globalSeed
37-
_globalSeed++
38-
_globalMut.Unlock()
39-
40-
ms := time.Now().Nanosecond() / 1000000
41-
prime1 := ms / 1000000000
42-
ms = ms - prime1
43-
prime2 := ms/1000 + addp + 1
44-
prime3 := (ms-prime2)*1000 + addp + 2
45+
func Seed() Rand {
46+
return SeedInt(0)
47+
}
48+
49+
//构造一个随机器(带个随机值)
50+
func SeedInt(s int) Rand {
51+
prime1 := time.Now().Nanosecond()
52+
prime2 := prime1/1000 + s + 1
53+
prime3 := (prime1-prime2)*1000 + s + 2
4554
return &_rand{prime1: prime1, prime2: prime2, prime3: prime3}
4655
}
4756

@@ -66,14 +75,14 @@ func GlobalSyncUniformFloat() float32 {
6675
return _globalRand.SyncUniformFloat()
6776
}
6877

69-
//全局并发不安全的随机1-max之间的小数(包括1和max)
70-
func GlobalUniformInt(max int) int {
71-
return _globalRand.UniformInt(max)
78+
//全局并发不安全的随机min-max之间的整数(包括1和max)
79+
func GlobalUniformInt(min int, max int) int {
80+
return _globalRand.UniformInt(min, max)
7281
}
7382

74-
//全局并发不安全的随机1-max之间的小数(包括1和max)
75-
func GlobalSyncUniformInt(max int) int {
76-
return _globalRand.SyncUniformInt(max)
83+
//全局并发不安全的随机1-max之间的整数(包括1和max)
84+
func GlobalSyncUniformInt(min int, max int) int {
85+
return _globalRand.SyncUniformInt(min, max)
7786
}
7887

7988
//并发不安全的随机0-1之间的小数(包括0不包括1)
@@ -91,19 +100,19 @@ func (_r *_rand) SyncUniformFloat() float32 {
91100
return r
92101
}
93102

94-
//并发不安全的随机1-max之间的小数(包括1和max)
95-
func (_r *_rand) UniformInt(max int) int {
96-
if max < 1 {
103+
//并发不安全的随机min-max之间的小数(包括1和max)
104+
func (_r *_rand) UniformInt(min int, max int) int {
105+
if max < min {
97106
panic("random UniformInt param max must >= 1")
98107
}
99108
f := _r.UniformFloat()
100-
return int(f*float32(max)) + 1
109+
return int(f*float32(max-min)) + min
101110
}
102111

103-
//并发不安全的随机1-max之间的小数(包括1和max)
104-
func (_r *_rand) SyncUniformInt(max int) int {
112+
//并发不安全的随机max-max之间的小数(包括1和max)
113+
func (_r *_rand) SyncUniformInt(min int, max int) int {
105114
_r._mut.Lock()
106-
r := _r.UniformInt(max)
115+
r := _r.UniformInt(min, max)
107116
_r._mut.Unlock()
108117
return r
109118
}

util/random_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package util
2+
3+
import (
4+
"math/rand"
5+
"testing"
6+
)
7+
8+
func BenchmarkMyRandom(b *testing.B) {
9+
for i := 0; i < b.N; i++ {
10+
GlobalSyncUniformInt(1, 100)
11+
}
12+
}
13+
14+
func BenchmarkGoRandom(b *testing.B) {
15+
for i := 0; i < b.N; i++ {
16+
rand.Intn(100)
17+
}
18+
}
19+
20+
type call struct {
21+
c chan interface{}
22+
info interface{}
23+
}
24+
type call_ret struct {
25+
info interface{}
26+
}
27+
28+
func run() chan interface{} {
29+
c := make(chan interface{}, 100)
30+
go func() {
31+
for {
32+
i := <-c
33+
switch i.(type) {
34+
case *call:
35+
//TODO 处理call请求
36+
ret := &call_ret{}
37+
i.(*call).c <- ret
38+
case *call_ret:
39+
//TODO 处理call请求结果
40+
default:
41+
}
42+
}
43+
}()
44+
return c
45+
}

util/runtime.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package util
2+
3+
import (
4+
"bytes"
5+
"runtime"
6+
)
7+
8+
//得到goroutine id 字符串(性能不好)
9+
func GoroutineID() string {
10+
buf := make([]byte, 15)
11+
buf = buf[:runtime.Stack(buf, false)]
12+
return string(bytes.Split(buf, []byte(" "))[1])
13+
}

0 commit comments

Comments
 (0)