Initial commit: Go 1.23 release state
This commit is contained in:
113
test/stress/maps.go
Normal file
113
test/stress/maps.go
Normal file
@@ -0,0 +1,113 @@
|
||||
// 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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user