Add extra line about src files are part of RIC platform project
[ric-plt/sdlgo.git] / bench_test.go
1 /*
2    Copyright (c) 2019 AT&T Intellectual Property.
3    Copyright (c) 2018-2019 Nokia.
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16 */
17
18 /*
19  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20  * platform project (RICP).
21  */
22
23 package sdlgo_test
24
25 import (
26         "fmt"
27         "strconv"
28         "strings"
29         "testing"
30
31         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
32 )
33
34 type singleBenchmark struct {
35         key       string
36         keySize   int
37         valueSize int
38 }
39
40 type multiBenchmark struct {
41         keyBase   string
42         keyCount  int
43         keySize   int
44         valueSize int
45 }
46
47 type setBenchmark struct {
48         key         string
49         member      string
50         memberCount int
51 }
52
53 func (bm singleBenchmark) String(oper string) string {
54         return fmt.Sprintf("op = %s key=%d value=%d", oper, bm.keySize, bm.valueSize)
55 }
56
57 func (bm multiBenchmark) String(oper string) string {
58         return fmt.Sprintf("op = %s keycnt=%d key=%d value=%d", oper, bm.keyCount, bm.keySize, bm.valueSize)
59 }
60
61 func (bm setBenchmark) String(oper string) string {
62         return fmt.Sprintf("op = %s, memberCount=%d", oper, bm.memberCount)
63 }
64 func BenchmarkSet(b *testing.B) {
65         benchmarks := []singleBenchmark{
66                 {"a", 10, 64},
67                 {"b", 10, 1024},
68                 {"c", 10, 64 * 1024},
69                 {"d", 10, 1024 * 1024},
70                 {"e", 10, 10 * 1024 * 1024},
71
72                 {"f", 100, 64},
73                 {"g", 100, 1024},
74                 {"h", 100, 64 * 1024},
75                 {"i", 100, 1024 * 1024},
76                 {"j", 100, 10 * 1024 * 1024},
77         }
78
79         for _, bm := range benchmarks {
80                 b.Run(bm.String("set"), func(b *testing.B) {
81                         key := strings.Repeat(bm.key, bm.keySize)
82                         value := strings.Repeat("1", bm.valueSize)
83                         sdl := sdlgo.NewSdlInstance("namespace", sdlgo.NewDatabase())
84
85                         b.ResetTimer()
86                         b.RunParallel(func(pb *testing.PB) {
87                                 for pb.Next() {
88                                         err := sdl.Set(key, value)
89                                         if err != nil {
90                                                 b.Fatal(err)
91                                         }
92                                 }
93                         })
94                 })
95         }
96 }
97
98 func BenchmarkGet(b *testing.B) {
99         benchmarks := []singleBenchmark{
100                 {"a", 10, 64},
101                 {"b", 10, 1024},
102                 {"c", 10, 64 * 1024},
103                 {"d", 10, 1024 * 1024},
104                 {"e", 10, 10 * 1024 * 1024},
105
106                 {"f", 100, 64},
107                 {"g", 100, 1024},
108                 {"h", 100, 64 * 1024},
109                 {"i", 100, 1024 * 1024},
110                 {"j", 100, 10 * 1024 * 1024},
111         }
112
113         for _, bm := range benchmarks {
114                 b.Run(bm.String("Get"), func(b *testing.B) {
115                         key := strings.Repeat(bm.key, bm.keySize)
116                         value := strings.Repeat("1", bm.valueSize)
117                         sdl := sdlgo.NewSdlInstance("namespace", sdlgo.NewDatabase())
118                         if err := sdl.Set(key, value); err != nil {
119                                 b.Fatal(err)
120                         }
121                         b.ResetTimer()
122                         b.RunParallel(func(pb *testing.PB) {
123                                 for pb.Next() {
124                                         _, err := sdl.Get([]string{key})
125                                         if err != nil {
126                                                 b.Fatal(err)
127                                         }
128                                 }
129                         })
130                 })
131         }
132 }
133
134 func BenchmarkMultiSet(b *testing.B) {
135         benchmarks := []multiBenchmark{
136                 {"a", 2, 10, 64},
137                 {"b", 10, 10, 64},
138                 {"c", 100, 10, 64},
139                 {"d", 1000, 10, 64},
140                 {"e", 5000, 10, 64},
141
142                 {"f", 2, 100, 64},
143                 {"g", 10, 100, 64},
144                 {"h", 100, 100, 64},
145                 {"i", 1000, 100, 64},
146                 {"j", 5000, 100, 64},
147         }
148
149         for _, bm := range benchmarks {
150                 b.Run(bm.String("mset"), func(b *testing.B) {
151                         sdl := sdlgo.NewSdlInstance("namespace", sdlgo.NewDatabase())
152                         value := strings.Repeat("1", bm.valueSize)
153                         keyVals := make([]string, 0)
154                         for i := 0; i < bm.keyCount; i++ {
155                                 key := strings.Repeat(bm.keyBase+strconv.Itoa(i), bm.keySize)
156                                 keyVals = append(keyVals, key, value)
157                         }
158                         b.ResetTimer()
159                         b.RunParallel(func(pb *testing.PB) {
160                                 for pb.Next() {
161                                         err := sdl.Set(keyVals)
162                                         if err != nil {
163                                                 b.Fatal(err)
164                                         }
165                                 }
166                         })
167                 })
168         }
169 }
170
171 func BenchmarkMultiGet(b *testing.B) {
172         benchmarks := []multiBenchmark{
173                 {"a", 2, 10, 64},
174                 {"b", 10, 10, 64},
175                 {"c", 100, 10, 64},
176                 {"d", 1000, 10, 64},
177                 {"e", 5000, 10, 64},
178
179                 {"f", 2, 100, 64},
180                 {"g", 10, 100, 64},
181                 {"h", 100, 100, 64},
182                 {"i", 1000, 100, 64},
183                 {"j", 5000, 100, 64},
184         }
185
186         for _, bm := range benchmarks {
187                 b.Run(bm.String("gset"), func(b *testing.B) {
188                         sdl := sdlgo.NewSdlInstance("namespace", sdlgo.NewDatabase())
189                         keyVals := make([]string, 0)
190                         for i := 0; i < bm.keyCount; i++ {
191                                 key := strings.Repeat(bm.keyBase+strconv.Itoa(i), bm.keySize)
192                                 keyVals = append(keyVals, key)
193                         }
194                         b.ResetTimer()
195                         b.RunParallel(func(pb *testing.PB) {
196                                 for pb.Next() {
197                                         _, err := sdl.Get(keyVals)
198                                         if err != nil {
199                                                 b.Fatal(err)
200                                         }
201                                 }
202                         })
203                 })
204         }
205 }
206
207 func BenchmarkSetAddMember(b *testing.B) {
208         benchmarks := []setBenchmark{
209                 {"a", "x", 1},
210                 {"b", "x", 100},
211                 {"c", "x", 10000},
212                 {"d", "x", 1000000},
213         }
214
215         for _, bm := range benchmarks {
216                 b.Run(bm.String("AddMember"), func(b *testing.B) {
217                         sdl := sdlgo.NewSdlInstance("namespace", sdlgo.NewDatabase())
218                         members := make([]string, 0)
219                         for i := 0; i < bm.memberCount; i++ {
220                                 member := bm.member + strconv.Itoa(i)
221                                 members = append(members, member)
222                         }
223                         b.ResetTimer()
224                         b.RunParallel(func(pb *testing.PB) {
225                                 for pb.Next() {
226                                         err := sdl.AddMember(bm.key, members)
227                                         if err != nil {
228                                                 b.Fatal(err)
229                                         }
230                                 }
231                         })
232                 })
233         }
234 }