Skip to content

Commit c3bb51c

Browse files
committed
use goschedule
1 parent a6a1ea7 commit c3bb51c

File tree

2 files changed

+58
-32
lines changed

2 files changed

+58
-32
lines changed

map.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package lrc
22

33
import (
44
"fmt"
5+
"runtime"
56
"sync"
67
"sync/atomic"
78
)
@@ -58,13 +59,13 @@ func (lr *LRMap) toggleVersionAndWait() {
5859
nextVI := int((localVI + 1) % 2)
5960

6061
for !lr.readIndicators[nextVI].isEmpty() {
61-
62+
runtime.Gosched()
6263
}
6364

6465
atomic.StoreInt32(lr.versionIndex, int32(nextVI))
6566

6667
for !lr.readIndicators[prevVI].isEmpty() {
67-
68+
runtime.Gosched()
6869
}
6970
}
7071

map_bench_test.go

+55-30
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import (
66
"testing"
77
)
88

9+
type testMap interface {
10+
Put(k, v int)
11+
Get(k int) (int, bool)
12+
}
13+
914
type LockMap struct {
1015
m map[int]int
1116
lock sync.RWMutex
@@ -83,55 +88,75 @@ func BenchmarkLockMap_Read(b *testing.B) {
8388
}
8489
}
8590

86-
func BenchmarkLRMap_Read_Write(b *testing.B) {
87-
m := InitLRMap(1000000)
88-
91+
func run(m testMap, reader int) {
8992
wg := sync.WaitGroup{}
9093

91-
wg.Add(1)
92-
go func() {
93-
for k := 0; k < b.N; k++ {
94-
m.Get(rand.Intn(10000))
95-
}
96-
wg.Done()
97-
}()
94+
for k := 0; k < reader; k++ {
95+
wg.Add(1)
96+
go func() {
97+
for i := 0; i < 100; i++ {
98+
m.Get(rand.Intn(10000))
99+
}
100+
wg.Done()
101+
}()
102+
}
98103

99104
wg.Add(1)
100105
go func() {
101-
for k := 0; k < b.N/10; k++ {
106+
for i := 0; i < 100; i++ {
102107
k := rand.Intn(10000)
103108
m.Put(k, k)
104109
}
105110
wg.Done()
106-
107111
}()
108112

109113
wg.Wait()
114+
}
115+
116+
func BenchmarkLRMap_Read_Write_5_1(b *testing.B) {
117+
m := InitLRMap(1000000)
110118

119+
for i := 0; i < b.N; i++ {
120+
run(m, 5)
121+
}
111122
}
112123

113-
func BenchmarkLockMap_Read_Write(b *testing.B) {
124+
func BenchmarkLockMap_Read_Write_5_1(b *testing.B) {
114125
m := InitLockMap(1000000)
115126

116-
wg := sync.WaitGroup{}
127+
for i := 0; i < b.N; i++ {
128+
run(m, 5)
129+
}
130+
}
117131

118-
wg.Add(1)
119-
go func() {
120-
for k := 0; k < b.N; k++ {
121-
m.Get(rand.Intn(10000))
122-
}
123-
wg.Done()
124-
}()
132+
func BenchmarkLRMap_Read_Write_10_1(b *testing.B) {
133+
m := InitLRMap(1000000)
125134

126-
wg.Add(1)
127-
go func() {
128-
for k := 0; k < b.N/10; k++ {
129-
k := rand.Intn(10000)
130-
m.Put(k, k)
131-
}
132-
wg.Done()
135+
for i := 0; i < b.N; i++ {
136+
run(m, 10)
137+
}
138+
}
133139

134-
}()
140+
func BenchmarkLockMap_Read_Write_10_1(b *testing.B) {
141+
m := InitLockMap(1000000)
135142

136-
wg.Wait()
143+
for i := 0; i < b.N; i++ {
144+
run(m, 10)
145+
}
146+
}
147+
148+
func BenchmarkLRMap_Read_Write_15_1(b *testing.B) {
149+
m := InitLRMap(1000000)
150+
151+
for i := 0; i < b.N; i++ {
152+
run(m, 15)
153+
}
154+
}
155+
156+
func BenchmarkLockMap_Read_Write_15_1(b *testing.B) {
157+
m := InitLockMap(1000000)
158+
159+
for i := 0; i < b.N; i++ {
160+
run(m, 15)
161+
}
137162
}

0 commit comments

Comments
 (0)