-
-
Save aybabtme/9653488c4f910097b109 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package set_test | |
import ( | |
"math/rand" | |
"testing" | |
) | |
func BenchmarkIntMap_2key(b *testing.B) { benchIntMapMembers(b, 2) } | |
func BenchmarkIntMap_3key(b *testing.B) { benchIntMapMembers(b, 3) } | |
func BenchmarkIntMap_4key(b *testing.B) { benchIntMapMembers(b, 4) } | |
func BenchmarkIntMap_5key(b *testing.B) { benchIntMapMembers(b, 5) } | |
func BenchmarkIntMap_6key(b *testing.B) { benchIntMapMembers(b, 6) } | |
func BenchmarkIntMap_7key(b *testing.B) { benchIntMapMembers(b, 7) } | |
func BenchmarkIntMap_8key(b *testing.B) { benchIntMapMembers(b, 8) } | |
func BenchmarkIntMap_9key(b *testing.B) { benchIntMapMembers(b, 9) } | |
func BenchmarkIntMap_10key(b *testing.B) { benchIntMapMembers(b, 10) } | |
func BenchmarkIntMap_100key(b *testing.B) { benchIntMapMembers(b, 100) } | |
func BenchmarkIntMap_1000key(b *testing.B) { benchIntMapMembers(b, 1000) } | |
func BenchmarkIntMap_10000key(b *testing.B) { benchIntMapMembers(b, 10000) } | |
func BenchmarkIntMap_100000key(b *testing.B) { benchIntMapMembers(b, 100000) } | |
func BenchmarkIntMap_1000000key(b *testing.B) { benchIntMapMembers(b, 1000000) } | |
func BenchmarkIntSlice_2key(b *testing.B) { benchIntSliceMembers(b, 2) } | |
func BenchmarkIntSlice_3key(b *testing.B) { benchIntSliceMembers(b, 3) } | |
func BenchmarkIntSlice_4key(b *testing.B) { benchIntSliceMembers(b, 4) } | |
func BenchmarkIntSlice_5key(b *testing.B) { benchIntSliceMembers(b, 5) } | |
func BenchmarkIntSlice_6key(b *testing.B) { benchIntSliceMembers(b, 6) } | |
func BenchmarkIntSlice_7key(b *testing.B) { benchIntSliceMembers(b, 7) } | |
func BenchmarkIntSlice_8key(b *testing.B) { benchIntSliceMembers(b, 8) } | |
func BenchmarkIntSlice_9key(b *testing.B) { benchIntSliceMembers(b, 9) } | |
func BenchmarkIntSlice_10key(b *testing.B) { benchIntSliceMembers(b, 10) } | |
func BenchmarkIntSlice_100key(b *testing.B) { benchIntSliceMembers(b, 100) } | |
func BenchmarkIntSlice_1000key(b *testing.B) { benchIntSliceMembers(b, 1000) } | |
func BenchmarkIntSlice_10000key(b *testing.B) { benchIntSliceMembers(b, 10000) } | |
func BenchmarkIntSlice_100000key(b *testing.B) { benchIntSliceMembers(b, 100000) } | |
func BenchmarkIntSlice_1000000key(b *testing.B) { benchIntSliceMembers(b, 1000000) } | |
func BenchmarkIntMapNot_10key(b *testing.B) { benchIntMapNotMembers(b, 10) } | |
func BenchmarkIntMapNot_1000key(b *testing.B) { benchIntMapNotMembers(b, 1000) } | |
func BenchmarkIntMapNot_1000000key(b *testing.B) { benchIntMapNotMembers(b, 1000000) } | |
func BenchmarkIntSliceNot_10key(b *testing.B) { benchIntSliceNotMembers(b, 10) } | |
func BenchmarkIntSliceNot_10000key(b *testing.B) { benchIntSliceNotMembers(b, 10000) } | |
func BenchmarkIntSliceNot_1000000key(b *testing.B) { benchIntSliceNotMembers(b, 1000000) } | |
// Helpers | |
func benchIntMapMembers(b *testing.B, size int) { | |
m := makeRandomIntMap(size) | |
samples := sampleFromIntMap(m, b.N) | |
var member int | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isIntMapMember(m, member) | |
} | |
_ = ok | |
} | |
func benchIntMapNotMembers(b *testing.B, size int) { | |
m := makeRandomIntMap(size) | |
samples := sampleNotInIntMap(m, b.N) | |
var member int | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isIntMapMember(m, member) | |
} | |
_ = ok | |
} | |
func benchIntSliceMembers(b *testing.B, size int) { | |
s := makeRandomIntSlice(size) | |
samples := sampleFromIntSlice(s, b.N) | |
var member int | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isIntSliceMember(s, member) | |
} | |
_ = ok | |
} | |
func benchIntSliceNotMembers(b *testing.B, size int) { | |
s := makeRandomIntSlice(size) | |
samples := sampleNotInIntSlice(s, b.N) | |
var member int | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isIntSliceMember(s, member) | |
} | |
_ = ok | |
} | |
// Membership tests | |
func isIntMapMember(m map[int]bool, key int) bool { | |
_, ok := m[key] | |
return ok | |
} | |
func isIntSliceMember(s []int, key int) bool { | |
for _, entry := range s { | |
if key == entry { | |
return true | |
} | |
} | |
return false | |
} | |
// Maps | |
func makeRandomIntMap(n int) map[int]bool { | |
set := make(map[int]bool, n) | |
var i int | |
for len(set) != n { | |
i = rand.Int() | |
if _, ok := set[i]; !ok { | |
set[i] = true | |
} | |
} | |
return set | |
} | |
func sampleFromIntMap(m map[int]bool, size int) (samples []int) { | |
var keys []int | |
for key := range m { | |
keys = append(keys, key) | |
} | |
for i := 0; i < size; i++ { | |
idx := rand.Intn(len(keys)) | |
samples = append(samples, keys[idx]) | |
} | |
return | |
} | |
func sampleNotInIntMap(m map[int]bool, size int) (samples []int) { | |
var i int | |
for len(samples) != size { | |
i = rand.Int() | |
if !m[i] { | |
samples = append(samples, i) | |
} | |
} | |
return | |
} | |
// Slices | |
func makeRandomIntSlice(size int) (uniques []int) { | |
set := make(map[int]bool, size) | |
var i int | |
for len(uniques) != size { | |
i = rand.Int() | |
if _, ok := set[i]; !ok { | |
set[i] = true | |
uniques = append(uniques, i) | |
} | |
} | |
return | |
} | |
func sampleFromIntSlice(s []int, size int) (samples []int) { | |
for i := 0; i < size; i++ { | |
idx := rand.Intn(len(s)) | |
samples = append(samples, s[idx]) | |
} | |
return | |
} | |
func sampleNotInIntSlice(s []int, size int) (samples []int) { | |
set := make(map[int]bool, size) | |
for _, key := range s { | |
set[key] = true | |
} | |
var i int | |
for len(samples) != size { | |
i = rand.Int() | |
if _, ok := set[i]; !ok { | |
samples = append(samples, i) | |
} | |
} | |
return | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package set_test | |
import ( | |
"math/rand" | |
"testing" | |
) | |
func BenchmarkMap_2key_10bytes(b *testing.B) { benchMapMembers(b, 2, 10) } | |
func BenchmarkMap_3key_10bytes(b *testing.B) { benchMapMembers(b, 3, 10) } | |
func BenchmarkMap_4key_10bytes(b *testing.B) { benchMapMembers(b, 4, 10) } | |
func BenchmarkMap_5key_10bytes(b *testing.B) { benchMapMembers(b, 5, 10) } | |
func BenchmarkMap_6key_10bytes(b *testing.B) { benchMapMembers(b, 6, 10) } | |
func BenchmarkMap_7key_10bytes(b *testing.B) { benchMapMembers(b, 7, 10) } | |
func BenchmarkMap_8key_10bytes(b *testing.B) { benchMapMembers(b, 8, 10) } | |
func BenchmarkMap_9key_10bytes(b *testing.B) { benchMapMembers(b, 9, 10) } | |
func BenchmarkMap_10key_10bytes(b *testing.B) { benchMapMembers(b, 10, 10) } | |
func BenchmarkMap_100key_10bytes(b *testing.B) { benchMapMembers(b, 100, 10) } | |
func BenchmarkMap_1000key_10bytes(b *testing.B) { benchMapMembers(b, 1000, 10) } | |
func BenchmarkMap_10000key_10bytes(b *testing.B) { benchMapMembers(b, 10000, 10) } | |
func BenchmarkMap_100000key_10bytes(b *testing.B) { benchMapMembers(b, 100000, 10) } | |
func BenchmarkMap_1000000key_10bytes(b *testing.B) { benchMapMembers(b, 1000000, 10) } | |
func BenchmarkMap_2key_100bytes(b *testing.B) { benchMapMembers(b, 2, 100) } | |
func BenchmarkMap_3key_100bytes(b *testing.B) { benchMapMembers(b, 3, 100) } | |
func BenchmarkMap_4key_100bytes(b *testing.B) { benchMapMembers(b, 4, 100) } | |
func BenchmarkMap_5key_100bytes(b *testing.B) { benchMapMembers(b, 5, 100) } | |
func BenchmarkMap_6key_100bytes(b *testing.B) { benchMapMembers(b, 6, 100) } | |
func BenchmarkMap_7key_100bytes(b *testing.B) { benchMapMembers(b, 7, 100) } | |
func BenchmarkMap_8key_100bytes(b *testing.B) { benchMapMembers(b, 8, 100) } | |
func BenchmarkMap_9key_100bytes(b *testing.B) { benchMapMembers(b, 9, 100) } | |
func BenchmarkMap_10key_100bytes(b *testing.B) { benchMapMembers(b, 10, 100) } | |
func BenchmarkMap_100key_100bytes(b *testing.B) { benchMapMembers(b, 100, 100) } | |
func BenchmarkMap_1000key_100bytes(b *testing.B) { benchMapMembers(b, 1000, 100) } | |
func BenchmarkMap_10000key_100bytes(b *testing.B) { benchMapMembers(b, 10000, 100) } | |
func BenchmarkMap_100000key_100bytes(b *testing.B) { benchMapMembers(b, 100000, 100) } | |
func BenchmarkMap_1000000key_100bytes(b *testing.B) { benchMapMembers(b, 1000000, 100) } | |
func BenchmarkSlice_2key_10bytes(b *testing.B) { benchSliceMembers(b, 2, 10) } | |
func BenchmarkSlice_3key_10bytes(b *testing.B) { benchSliceMembers(b, 3, 10) } | |
func BenchmarkSlice_4key_10bytes(b *testing.B) { benchSliceMembers(b, 4, 10) } | |
func BenchmarkSlice_5key_10bytes(b *testing.B) { benchSliceMembers(b, 5, 10) } | |
func BenchmarkSlice_6key_10bytes(b *testing.B) { benchSliceMembers(b, 6, 10) } | |
func BenchmarkSlice_7key_10bytes(b *testing.B) { benchSliceMembers(b, 7, 10) } | |
func BenchmarkSlice_8key_10bytes(b *testing.B) { benchSliceMembers(b, 8, 10) } | |
func BenchmarkSlice_9key_10bytes(b *testing.B) { benchSliceMembers(b, 9, 10) } | |
func BenchmarkSlice_10key_10bytes(b *testing.B) { benchSliceMembers(b, 10, 10) } | |
func BenchmarkSlice_100key_10bytes(b *testing.B) { benchSliceMembers(b, 100, 10) } | |
func BenchmarkSlice_1000key_10bytes(b *testing.B) { benchSliceMembers(b, 1000, 10) } | |
func BenchmarkSlice_10000key_10bytes(b *testing.B) { benchSliceMembers(b, 10000, 10) } | |
func BenchmarkSlice_100000key_10bytes(b *testing.B) { benchSliceMembers(b, 100000, 10) } | |
func BenchmarkSlice_1000000key_10bytes(b *testing.B) { benchSliceMembers(b, 1000000, 10) } | |
func BenchmarkSlice_2key_100bytes(b *testing.B) { benchSliceMembers(b, 2, 100) } | |
func BenchmarkSlice_3key_100bytes(b *testing.B) { benchSliceMembers(b, 3, 100) } | |
func BenchmarkSlice_4key_100bytes(b *testing.B) { benchSliceMembers(b, 4, 100) } | |
func BenchmarkSlice_5key_100bytes(b *testing.B) { benchSliceMembers(b, 5, 100) } | |
func BenchmarkSlice_6key_100bytes(b *testing.B) { benchSliceMembers(b, 6, 100) } | |
func BenchmarkSlice_7key_100bytes(b *testing.B) { benchSliceMembers(b, 7, 100) } | |
func BenchmarkSlice_8key_100bytes(b *testing.B) { benchSliceMembers(b, 8, 100) } | |
func BenchmarkSlice_9key_100bytes(b *testing.B) { benchSliceMembers(b, 9, 100) } | |
func BenchmarkSlice_10key_100bytes(b *testing.B) { benchSliceMembers(b, 10, 100) } | |
func BenchmarkSlice_100key_100bytes(b *testing.B) { benchSliceMembers(b, 100, 100) } | |
func BenchmarkSlice_1000key_100bytes(b *testing.B) { benchSliceMembers(b, 1000, 100) } | |
func BenchmarkSlice_10000key_100bytes(b *testing.B) { benchSliceMembers(b, 10000, 100) } | |
func BenchmarkSlice_100000key_100bytes(b *testing.B) { benchSliceMembers(b, 100000, 100) } | |
func BenchmarkSlice_1000000key_100bytes(b *testing.B) { benchSliceMembers(b, 1000000, 100) } | |
func BenchmarkMapNot_10key_10bytes(b *testing.B) { benchMapNotMembers(b, 10, 10) } | |
func BenchmarkMapNot_1000key_10bytes(b *testing.B) { benchMapNotMembers(b, 1000, 10) } | |
func BenchmarkMapNot_1000000key_10bytes(b *testing.B) { benchMapNotMembers(b, 1000000, 10) } | |
func BenchmarkSliceNot_10key_10bytes(b *testing.B) { benchSliceNotMembers(b, 10, 10) } | |
func BenchmarkSliceNot_10000key_10bytes(b *testing.B) { benchSliceNotMembers(b, 10000, 10) } | |
func BenchmarkSliceNot_1000000key_10bytes(b *testing.B) { benchSliceNotMembers(b, 1000000, 10) } | |
// Helpers | |
func benchMapMembers(b *testing.B, size int, keySize int) { | |
// b.Logf("making rand map, size %d, key sized %d", size, keySize) | |
m := makeRandomMap(size, keySize) | |
// b.Logf("taking %d rand sample in map, key sized %d", b.N) | |
samples := sampleFromMap(m, b.N) | |
var member string | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isMapMember(m, member) | |
} | |
_ = ok | |
} | |
func benchMapNotMembers(b *testing.B, size int, keySize int) { | |
// b.Logf("making rand map, size %d, key sized %d", size, keySize) | |
m := makeRandomMap(size, keySize) | |
// b.Logf("taking %d rand sample not in map, key sized %d", b.N, keySize) | |
samples := sampleNotInMap(m, b.N, keySize) | |
var member string | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isMapMember(m, member) | |
} | |
_ = ok | |
} | |
func benchSliceMembers(b *testing.B, size int, keySize int) { | |
// b.Logf("making rand slice, size %d, key sized %d", size, keySize) | |
s := makeRandomSlice(size, keySize) | |
// b.Logf("taking %d rand sample in slice", b.N) | |
samples := sampleFromSlice(s, b.N) | |
var member string | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isSliceMember(s, member) | |
} | |
_ = ok | |
} | |
func benchSliceNotMembers(b *testing.B, size int, keySize int) { | |
// b.Logf("making rand slice, size %d, key sized %d", size, keySize) | |
s := makeRandomSlice(size, keySize) | |
// b.Logf("taking %d rand sample not in slice, key sized %d", b.N, keySize) | |
samples := sampleNotInSlice(s, b.N, keySize) | |
var member string | |
var ok bool | |
// b.Log("starting") | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
member = samples[i] | |
ok = isSliceMember(s, member) | |
} | |
_ = ok | |
} | |
// Membership tests | |
func isMapMember(m map[string]bool, key string) bool { | |
_, ok := m[key] | |
return ok | |
} | |
func isSliceMember(s []string, key string) bool { | |
for _, entry := range s { | |
if key == entry { | |
return true | |
} | |
} | |
return false | |
} | |
// Maps | |
func makeRandomMap(n, valSize int) map[string]bool { | |
set := make(map[string]bool, n) | |
var str string | |
for len(set) != n { | |
str = makeRandomString(valSize) | |
if _, ok := set[str]; !ok { | |
set[str] = true | |
} | |
} | |
return set | |
} | |
func sampleFromMap(m map[string]bool, size int) (samples []string) { | |
var keys []string | |
for key := range m { | |
keys = append(keys, key) | |
} | |
for i := 0; i < size; i++ { | |
idx := rand.Intn(len(keys)) | |
samples = append(samples, keys[idx]) | |
} | |
return | |
} | |
func sampleNotInMap(m map[string]bool, size, keySize int) (samples []string) { | |
var str string | |
for len(samples) != size { | |
str = makeRandomString(keySize) | |
if !m[str] { | |
samples = append(samples, str) | |
} | |
} | |
return | |
} | |
// Slices | |
func makeRandomSlice(size, strSize int) (uniques []string) { | |
set := make(map[string]bool, size) | |
var str string | |
for len(uniques) != size { | |
str = makeRandomString(strSize) | |
if _, ok := set[str]; !ok { | |
set[str] = true | |
uniques = append(uniques, str) | |
} | |
} | |
return | |
} | |
func sampleFromSlice(s []string, size int) (samples []string) { | |
for i := 0; i < size; i++ { | |
idx := rand.Intn(len(s)) | |
samples = append(samples, s[idx]) | |
} | |
return | |
} | |
func sampleNotInSlice(s []string, size, keySize int) (samples []string) { | |
set := make(map[string]bool, size) | |
for _, key := range s { | |
set[key] = true | |
} | |
var str string | |
for len(samples) != size { | |
str = makeRandomString(keySize) | |
if _, ok := set[str]; !ok { | |
samples = append(samples, str) | |
} | |
} | |
return | |
} | |
// Strings | |
func makeRandomString(size int) string { | |
raw := make([]rune, size) | |
for i := range raw { | |
raw[i] = randRune() | |
} | |
return string(raw) | |
} | |
func randRune() rune { | |
const runeString = `01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()` | |
i := rand.Intn(len(runeString)) | |
return []rune(runeString)[i] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Int map/slice membership benchmark: