package mapset import ( "math/rand" "testing" ) func nrand(n int) []int { i := make([]int, n) for ind := range i { i[ind] = rand.Int() } return i } func toInterfaces(i []int) []interface{} { ifs := make([]interface{}, len(i)) for ind, v := range i { ifs[ind] = v } return ifs } func benchAdd(b *testing.B, s Set) { nums := nrand(b.N) b.ResetTimer() for _, v := range nums { s.Add(v) } } func BenchmarkAddSafe(b *testing.B) { benchAdd(b, NewSet()) } func BenchmarkAddUnsafe(b *testing.B) { benchAdd(b, NewThreadUnsafeSet()) } func benchRemove(b *testing.B, s Set) { nums := nrand(b.N) for _, v := range nums { s.Add(v) } b.ResetTimer() for _, v := range nums { s.Remove(v) } } func BenchmarkRemoveSafe(b *testing.B) { benchRemove(b, NewSet()) } func BenchmarkRemoveUnsafe(b *testing.B) { benchRemove(b, NewThreadUnsafeSet()) } func benchCardinality(b *testing.B, s Set) { for i := 0; i < b.N; i++ { s.Cardinality() } } func BenchmarkCardinalitySafe(b *testing.B) { benchCardinality(b, NewSet()) } func BenchmarkCardinalityUnsafe(b *testing.B) { benchCardinality(b, NewThreadUnsafeSet()) } func benchClear(b *testing.B, s Set) { b.ResetTimer() for i := 0; i < b.N; i++ { s.Clear() } } func BenchmarkClearSafe(b *testing.B) { benchClear(b, NewSet()) } func BenchmarkClearUnsafe(b *testing.B) { benchClear(b, NewThreadUnsafeSet()) } func benchClone(b *testing.B, n int, s Set) { nums := toInterfaces(nrand(n)) for _, v := range nums { s.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.Clone() } } func BenchmarkClone1Safe(b *testing.B) { benchClone(b, 1, NewSet()) } func BenchmarkClone1Unsafe(b *testing.B) { benchClone(b, 1, NewThreadUnsafeSet()) } func BenchmarkClone10Safe(b *testing.B) { benchClone(b, 10, NewSet()) } func BenchmarkClone10Unsafe(b *testing.B) { benchClone(b, 10, NewThreadUnsafeSet()) } func BenchmarkClone100Safe(b *testing.B) { benchClone(b, 100, NewSet()) } func BenchmarkClone100Unsafe(b *testing.B) { benchClone(b, 100, NewThreadUnsafeSet()) } func benchContains(b *testing.B, n int, s Set) { nums := toInterfaces(nrand(n)) for _, v := range nums { s.Add(v) } nums[n-1] = -1 // Definitely not in s b.ResetTimer() for i := 0; i < b.N; i++ { s.Contains(nums...) } } func BenchmarkContains1Safe(b *testing.B) { benchContains(b, 1, NewSet()) } func BenchmarkContains1Unsafe(b *testing.B) { benchContains(b, 1, NewThreadUnsafeSet()) } func BenchmarkContains10Safe(b *testing.B) { benchContains(b, 10, NewSet()) } func BenchmarkContains10Unsafe(b *testing.B) { benchContains(b, 10, NewThreadUnsafeSet()) } func BenchmarkContains100Safe(b *testing.B) { benchContains(b, 100, NewSet()) } func BenchmarkContains100Unsafe(b *testing.B) { benchContains(b, 100, NewThreadUnsafeSet()) } func benchEqual(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums { s.Add(v) t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.Equal(t) } } func BenchmarkEqual1Safe(b *testing.B) { benchEqual(b, 1, NewSet(), NewSet()) } func BenchmarkEqual1Unsafe(b *testing.B) { benchEqual(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkEqual10Safe(b *testing.B) { benchEqual(b, 10, NewSet(), NewSet()) } func BenchmarkEqual10Unsafe(b *testing.B) { benchEqual(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkEqual100Safe(b *testing.B) { benchEqual(b, 100, NewSet(), NewSet()) } func BenchmarkEqual100Unsafe(b *testing.B) { benchEqual(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchDifference(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums { s.Add(v) } for _, v := range nums[:n/2] { t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.Difference(t) } } func benchIsSubset(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums { s.Add(v) t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.IsSubset(t) } } func BenchmarkIsSubset1Safe(b *testing.B) { benchIsSubset(b, 1, NewSet(), NewSet()) } func BenchmarkIsSubset1Unsafe(b *testing.B) { benchIsSubset(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsSubset10Safe(b *testing.B) { benchIsSubset(b, 10, NewSet(), NewSet()) } func BenchmarkIsSubset10Unsafe(b *testing.B) { benchIsSubset(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsSubset100Safe(b *testing.B) { benchIsSubset(b, 100, NewSet(), NewSet()) } func BenchmarkIsSubset100Unsafe(b *testing.B) { benchIsSubset(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchIsSuperset(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums { s.Add(v) t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.IsSuperset(t) } } func BenchmarkIsSuperset1Safe(b *testing.B) { benchIsSuperset(b, 1, NewSet(), NewSet()) } func BenchmarkIsSuperset1Unsafe(b *testing.B) { benchIsSuperset(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsSuperset10Safe(b *testing.B) { benchIsSuperset(b, 10, NewSet(), NewSet()) } func BenchmarkIsSuperset10Unsafe(b *testing.B) { benchIsSuperset(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsSuperset100Safe(b *testing.B) { benchIsSuperset(b, 100, NewSet(), NewSet()) } func BenchmarkIsSuperset100Unsafe(b *testing.B) { benchIsSuperset(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchIsProperSubset(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums { s.Add(v) t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.IsProperSubset(t) } } func BenchmarkIsProperSubset1Safe(b *testing.B) { benchIsProperSubset(b, 1, NewSet(), NewSet()) } func BenchmarkIsProperSubset1Unsafe(b *testing.B) { benchIsProperSubset(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsProperSubset10Safe(b *testing.B) { benchIsProperSubset(b, 10, NewSet(), NewSet()) } func BenchmarkIsProperSubset10Unsafe(b *testing.B) { benchIsProperSubset(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsProperSubset100Safe(b *testing.B) { benchIsProperSubset(b, 100, NewSet(), NewSet()) } func BenchmarkIsProperSubset100Unsafe(b *testing.B) { benchIsProperSubset(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchIsProperSuperset(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums { s.Add(v) t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.IsProperSuperset(t) } } func BenchmarkIsProperSuperset1Safe(b *testing.B) { benchIsProperSuperset(b, 1, NewSet(), NewSet()) } func BenchmarkIsProperSuperset1Unsafe(b *testing.B) { benchIsProperSuperset(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsProperSuperset10Safe(b *testing.B) { benchIsProperSuperset(b, 10, NewSet(), NewSet()) } func BenchmarkIsProperSuperset10Unsafe(b *testing.B) { benchIsProperSuperset(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIsProperSuperset100Safe(b *testing.B) { benchIsProperSuperset(b, 100, NewSet(), NewSet()) } func BenchmarkIsProperSuperset100Unsafe(b *testing.B) { benchIsProperSuperset(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkDifference1Safe(b *testing.B) { benchDifference(b, 1, NewSet(), NewSet()) } func BenchmarkDifference1Unsafe(b *testing.B) { benchDifference(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkDifference10Safe(b *testing.B) { benchDifference(b, 10, NewSet(), NewSet()) } func BenchmarkDifference10Unsafe(b *testing.B) { benchDifference(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkDifference100Safe(b *testing.B) { benchDifference(b, 100, NewSet(), NewSet()) } func BenchmarkDifference100Unsafe(b *testing.B) { benchDifference(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchIntersect(b *testing.B, n int, s, t Set) { nums := nrand(int(float64(n) * float64(1.5))) for _, v := range nums[:n] { s.Add(v) } for _, v := range nums[n/2:] { t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.Intersect(t) } } func BenchmarkIntersect1Safe(b *testing.B) { benchIntersect(b, 1, NewSet(), NewSet()) } func BenchmarkIntersect1Unsafe(b *testing.B) { benchIntersect(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIntersect10Safe(b *testing.B) { benchIntersect(b, 10, NewSet(), NewSet()) } func BenchmarkIntersect10Unsafe(b *testing.B) { benchIntersect(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkIntersect100Safe(b *testing.B) { benchIntersect(b, 100, NewSet(), NewSet()) } func BenchmarkIntersect100Unsafe(b *testing.B) { benchIntersect(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchSymmetricDifference(b *testing.B, n int, s, t Set) { nums := nrand(int(float64(n) * float64(1.5))) for _, v := range nums[:n] { s.Add(v) } for _, v := range nums[n/2:] { t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.SymmetricDifference(t) } } func BenchmarkSymmetricDifference1Safe(b *testing.B) { benchSymmetricDifference(b, 1, NewSet(), NewSet()) } func BenchmarkSymmetricDifference1Unsafe(b *testing.B) { benchSymmetricDifference(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkSymmetricDifference10Safe(b *testing.B) { benchSymmetricDifference(b, 10, NewSet(), NewSet()) } func BenchmarkSymmetricDifference10Unsafe(b *testing.B) { benchSymmetricDifference(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkSymmetricDifference100Safe(b *testing.B) { benchSymmetricDifference(b, 100, NewSet(), NewSet()) } func BenchmarkSymmetricDifference100Unsafe(b *testing.B) { benchSymmetricDifference(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchUnion(b *testing.B, n int, s, t Set) { nums := nrand(n) for _, v := range nums[:n/2] { s.Add(v) } for _, v := range nums[n/2:] { t.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.Union(t) } } func BenchmarkUnion1Safe(b *testing.B) { benchUnion(b, 1, NewSet(), NewSet()) } func BenchmarkUnion1Unsafe(b *testing.B) { benchUnion(b, 1, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkUnion10Safe(b *testing.B) { benchUnion(b, 10, NewSet(), NewSet()) } func BenchmarkUnion10Unsafe(b *testing.B) { benchUnion(b, 10, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func BenchmarkUnion100Safe(b *testing.B) { benchUnion(b, 100, NewSet(), NewSet()) } func BenchmarkUnion100Unsafe(b *testing.B) { benchUnion(b, 100, NewThreadUnsafeSet(), NewThreadUnsafeSet()) } func benchEach(b *testing.B, n int, s Set) { nums := nrand(n) for _, v := range nums { s.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.Each(func(elem interface{}) bool { return false }) } } func BenchmarkEach1Safe(b *testing.B) { benchEach(b, 1, NewSet()) } func BenchmarkEach1Unsafe(b *testing.B) { benchEach(b, 1, NewThreadUnsafeSet()) } func BenchmarkEach10Safe(b *testing.B) { benchEach(b, 10, NewSet()) } func BenchmarkEach10Unsafe(b *testing.B) { benchEach(b, 10, NewThreadUnsafeSet()) } func BenchmarkEach100Safe(b *testing.B) { benchEach(b, 100, NewSet()) } func BenchmarkEach100Unsafe(b *testing.B) { benchEach(b, 100, NewThreadUnsafeSet()) } func benchIter(b *testing.B, n int, s Set) { nums := nrand(n) for _, v := range nums { s.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { c := s.Iter() for range c { } } } func BenchmarkIter1Safe(b *testing.B) { benchIter(b, 1, NewSet()) } func BenchmarkIter1Unsafe(b *testing.B) { benchIter(b, 1, NewThreadUnsafeSet()) } func BenchmarkIter10Safe(b *testing.B) { benchIter(b, 10, NewSet()) } func BenchmarkIter10Unsafe(b *testing.B) { benchIter(b, 10, NewThreadUnsafeSet()) } func BenchmarkIter100Safe(b *testing.B) { benchIter(b, 100, NewSet()) } func BenchmarkIter100Unsafe(b *testing.B) { benchIter(b, 100, NewThreadUnsafeSet()) } func benchIterator(b *testing.B, n int, s Set) { nums := nrand(n) for _, v := range nums { s.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { c := s.Iterator().C for range c { } } } func BenchmarkIterator1Safe(b *testing.B) { benchIterator(b, 1, NewSet()) } func BenchmarkIterator1Unsafe(b *testing.B) { benchIterator(b, 1, NewThreadUnsafeSet()) } func BenchmarkIterator10Safe(b *testing.B) { benchIterator(b, 10, NewSet()) } func BenchmarkIterator10Unsafe(b *testing.B) { benchIterator(b, 10, NewThreadUnsafeSet()) } func BenchmarkIterator100Safe(b *testing.B) { benchIterator(b, 100, NewSet()) } func BenchmarkIterator100Unsafe(b *testing.B) { benchIterator(b, 100, NewThreadUnsafeSet()) } func benchString(b *testing.B, n int, s Set) { nums := nrand(n) for _, v := range nums { s.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { _ = s.String() } } func BenchmarkString1Safe(b *testing.B) { benchString(b, 1, NewSet()) } func BenchmarkString1Unsafe(b *testing.B) { benchString(b, 1, NewThreadUnsafeSet()) } func BenchmarkString10Safe(b *testing.B) { benchString(b, 10, NewSet()) } func BenchmarkString10Unsafe(b *testing.B) { benchString(b, 10, NewThreadUnsafeSet()) } func BenchmarkString100Safe(b *testing.B) { benchString(b, 100, NewSet()) } func BenchmarkString100Unsafe(b *testing.B) { benchString(b, 100, NewThreadUnsafeSet()) } func benchToSlice(b *testing.B, s Set) { nums := nrand(b.N) for _, v := range nums { s.Add(v) } b.ResetTimer() for i := 0; i < b.N; i++ { s.ToSlice() } } func BenchmarkToSliceSafe(b *testing.B) { benchToSlice(b, NewSet()) } func BenchmarkToSliceUnsafe(b *testing.B) { benchToSlice(b, NewThreadUnsafeSet()) }