// Copyright 2013 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
package main | |
import ( | |
"math/rand" | |
"runtime" | |
"sync" | |
) | |
func mapTypes() []MapType { | |
// TODO(bradfitz): bunch more map types of all different key and value types. | |
// Use reflect.MapOf and a program to generate lots of types & struct types. | |
// For now, just one: | |
return []MapType{intMapType{}} | |
} | |
type MapType interface { | |
NewMap() Map | |
} | |
type Map interface { | |
AddItem() | |
DelItem() | |
Len() int | |
GetItem() | |
RangeAll() | |
} | |
func stressMapType(mt MapType, done func()) { | |
defer done() | |
m := mt.NewMap() | |
for m.Len() < 10000 { | |
Println("map at ", m.Len()) | |
if m.Len()%100 == 0 { | |
runtime.Gosched() | |
} | |
m.AddItem() | |
m.AddItem() | |
m.DelItem() | |
var wg sync.WaitGroup | |
const numGets = 10 | |
wg.Add(numGets) | |
for i := 0; i < numGets; i++ { | |
go func(i int) { | |
if i&1 == 0 { | |
m.GetItem() | |
} else { | |
m.RangeAll() | |
} | |
wg.Done() | |
}(i) | |
} | |
wg.Wait() | |
} | |
for m.Len() > 0 { | |
m.DelItem() | |
} | |
} | |
type intMapType struct{} | |
func (intMapType) NewMap() Map { | |
return make(intMap) | |
} | |
var deadcafe = []byte("\xDE\xAD\xCA\xFE") | |
type intMap map[int][]byte | |
func (m intMap) AddItem() { | |
s0 := len(m) | |
for len(m) == s0 { | |
key := rand.Intn(s0 + 1) | |
m[key] = make([]byte, rand.Intn(64<<10)) | |
} | |
} | |
func (m intMap) DelItem() { | |
for k := range m { | |
delete(m, k) | |
return | |
} | |
} | |
func (m intMap) GetItem() { | |
key := rand.Intn(len(m)) | |
if s, ok := m[key]; ok { | |
copy(s, deadcafe) | |
} | |
} | |
func (m intMap) Len() int { return len(m) } | |
func (m intMap) RangeAll() { | |
for _ = range m { | |
} | |
for range m { | |
} | |
} | |
func stressMaps() { | |
for { | |
var wg sync.WaitGroup | |
for _, mt := range mapTypes() { | |
wg.Add(1) | |
go stressMapType(mt, wg.Done) | |
} | |
wg.Wait() | |
} | |
} |