Browse code

Benchmarks for engine/env

Docker-DCO-1.1-Signed-off-by: Alexandr Morozov <lk4d4math@gmail.com> (github: LK4D4)

LK4D4 authored on 2014/06/22 20:58:43
Showing 2 changed files
... ...
@@ -1,7 +1,10 @@
1 1
 package engine
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"testing"
6
+
7
+	"github.com/dotcloud/docker/pkg/testutils"
5 8
 )
6 9
 
7 10
 func TestEnvLenZero(t *testing.T) {
... ...
@@ -143,3 +146,126 @@ func TestMultiMap(t *testing.T) {
143 143
 		t.Fatalf("%#v", v)
144 144
 	}
145 145
 }
146
+
147
+func testMap(l int) [][2]string {
148
+	res := make([][2]string, l)
149
+	for i := 0; i < l; i++ {
150
+		t := [2]string{testutils.RandomString(5), testutils.RandomString(20)}
151
+		res[i] = t
152
+	}
153
+	return res
154
+}
155
+
156
+func BenchmarkSet(b *testing.B) {
157
+	fix := testMap(100)
158
+	b.ResetTimer()
159
+	for i := 0; i < b.N; i++ {
160
+		env := &Env{}
161
+		for _, kv := range fix {
162
+			env.Set(kv[0], kv[1])
163
+		}
164
+	}
165
+}
166
+
167
+func BenchmarkSetJson(b *testing.B) {
168
+	fix := testMap(100)
169
+	type X struct {
170
+		f string
171
+	}
172
+	b.ResetTimer()
173
+	for i := 0; i < b.N; i++ {
174
+		env := &Env{}
175
+		for _, kv := range fix {
176
+			if err := env.SetJson(kv[0], X{kv[1]}); err != nil {
177
+				b.Fatal(err)
178
+			}
179
+		}
180
+	}
181
+}
182
+
183
+func BenchmarkGet(b *testing.B) {
184
+	fix := testMap(100)
185
+	env := &Env{}
186
+	for _, kv := range fix {
187
+		env.Set(kv[0], kv[1])
188
+	}
189
+	b.ResetTimer()
190
+	for i := 0; i < b.N; i++ {
191
+		for _, kv := range fix {
192
+			env.Get(kv[0])
193
+		}
194
+	}
195
+}
196
+
197
+func BenchmarkGetJson(b *testing.B) {
198
+	fix := testMap(100)
199
+	env := &Env{}
200
+	type X struct {
201
+		f string
202
+	}
203
+	for _, kv := range fix {
204
+		env.SetJson(kv[0], X{kv[1]})
205
+	}
206
+	b.ResetTimer()
207
+	for i := 0; i < b.N; i++ {
208
+		for _, kv := range fix {
209
+			if err := env.GetJson(kv[0], &X{}); err != nil {
210
+				b.Fatal(err)
211
+			}
212
+		}
213
+	}
214
+}
215
+
216
+func BenchmarkEncode(b *testing.B) {
217
+	fix := testMap(100)
218
+	env := &Env{}
219
+	type X struct {
220
+		f string
221
+	}
222
+	// half a json
223
+	for i, kv := range fix {
224
+		if i%2 != 0 {
225
+			if err := env.SetJson(kv[0], X{kv[1]}); err != nil {
226
+				b.Fatal(err)
227
+			}
228
+			continue
229
+		}
230
+		env.Set(kv[0], kv[1])
231
+	}
232
+	var writer bytes.Buffer
233
+	b.ResetTimer()
234
+	for i := 0; i < b.N; i++ {
235
+		env.Encode(&writer)
236
+		writer.Reset()
237
+	}
238
+}
239
+
240
+func BenchmarkDecode(b *testing.B) {
241
+	fix := testMap(100)
242
+	env := &Env{}
243
+	type X struct {
244
+		f string
245
+	}
246
+	// half a json
247
+	for i, kv := range fix {
248
+		if i%2 != 0 {
249
+			if err := env.SetJson(kv[0], X{kv[1]}); err != nil {
250
+				b.Fatal(err)
251
+			}
252
+			continue
253
+		}
254
+		env.Set(kv[0], kv[1])
255
+	}
256
+	var writer bytes.Buffer
257
+	env.Encode(&writer)
258
+	denv := &Env{}
259
+	reader := bytes.NewReader(writer.Bytes())
260
+	b.ResetTimer()
261
+	for i := 0; i < b.N; i++ {
262
+		err := denv.Decode(reader)
263
+		if err != nil {
264
+			b.Fatal(err)
265
+		}
266
+		reader.Seek(0, 0)
267
+	}
268
+}
... ...
@@ -1,10 +1,15 @@
1 1
 package testutils
2 2
 
3 3
 import (
4
+	"math/rand"
4 5
 	"testing"
5 6
 	"time"
6 7
 )
7 8
 
9
+const chars = "abcdefghijklmnopqrstuvwxyz" +
10
+	"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
11
+	"~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` "
12
+
8 13
 // Timeout calls f and waits for 100ms for it to complete.
9 14
 // If it doesn't, it causes the tests to fail.
10 15
 // t must be a valid testing context.
... ...
@@ -21,3 +26,12 @@ func Timeout(t *testing.T, f func()) {
21 21
 	case <-onDone:
22 22
 	}
23 23
 }
24
+
25
+// RandomString returns random string of specified length
26
+func RandomString(length int) string {
27
+	res := make([]byte, length)
28
+	for i := 0; i < length; i++ {
29
+		res[i] = chars[rand.Intn(len(chars))]
30
+	}
31
+	return string(res)
32
+}