Skip to content

Commit

Permalink
#16 replace filter bench.
Browse files Browse the repository at this point in the history
  • Loading branch information
meian committed Jan 14, 2022
1 parent d50eb7e commit d5a9b8e
Showing 1 changed file with 122 additions and 138 deletions.
260 changes: 122 additions & 138 deletions bench/filter_test.go
Original file line number Diff line number Diff line change
@@ -1,166 +1,150 @@
package gcf_test

import (
"fmt"
"testing"

"github.com/meian/gcf"
)

func BenchmarkFilter_100_1(b *testing.B) {
// usually case
benchFilter(b, 100, 1, func(i int) func(int) bool {
return func(v int) bool {
return v/100 > i
func BenchmarkFilter_Volumes(b *testing.B) {
sLens := []int{10, 100, 1000}
fLens := []int{1, 5, 10, 100}
for _, sLen := range sLens {
for _, fLen := range fLens {
name := fmt.Sprintf("slice=%d/filter=%d", sLen, fLen)
b.Run(name, func(b *testing.B) {
s := make([]int, sLen)
for i := range s {
s[i] = i + 1
}
itb := gcf.FromSlice(s)
for i := 0; i < fLen; i++ {
itb = gcf.Filter(itb, func(v int) bool {
return true
})
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
it := itb.Iterator()
for it.MoveNext() {
}
}
})
}
})
}

func BenchmarkFilter_1000_10(b *testing.B) {
// usually large case
benchFilter(b, 1000, 10, func(i int) func(int) bool {
return func(v int) bool {
return v/100 > i
}
})
}

func BenchmarkFilter_100_100(b *testing.B) {
benchFilter(b, 100, 100, func(i int) func(int) bool {
return func(v int) bool {
return v > i
}
})
}

func BenchmarkFilter_200_100(b *testing.B) {
benchFilter(b, 200, 100, func(i int) func(int) bool {
return func(v int) bool {
return v/2 > i
}
})
}

func BenchmarkFilter_1000_100(b *testing.B) {
benchFilter(b, 1000, 100, func(i int) func(int) bool {
return func(v int) bool {
return v/10 > i
}
})
}

func BenchmarkFilter_100_200(b *testing.B) {
benchFilter(b, 100, 200, func(i int) func(int) bool {
return func(v int) bool {
return v*2 > i
}
})
}

func BenchmarkFilter_100_1000(b *testing.B) {
benchFilter(b, 100, 1000, func(i int) func(int) bool {
return func(v int) bool {
return v*10 > i
}
})
}
}

func benchFilter(b *testing.B, sLen, itCnt int, f func(int) func(int) bool) {
s := make([]int, sLen)
for i := range s {
func BenchmarkFilter_Compare(b *testing.B) {
s := make([]int, 100)
for i := 0; i < len(s); i++ {
s[i] = i + 1
}
itb := gcf.FromSlice(s)
for i := 0; i < itCnt; i++ {
i := i
itb = gcf.Filter(itb, f(i))
f13 := func(v int) bool {
return v%13 > 0
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
sum := 0
it := itb.Iterator()
for it.MoveNext() {
sum += it.Current()
}
f11 := func(v int) bool {
return v%11 > 0
}
f7 := func(v int) bool {
return v%7 > 0
}
}

func BenchmarkOnLoop_100_1(b *testing.B) {
benchOnLoop(b, 100, 1, func(v int) func(int) bool {
return func(i int) bool {
return v/100 > i
}
})
}

func BenchmarkOnLoop_1000_10(b *testing.B) {
benchOnLoop(b, 1000, 10, func(v int) func(int) bool {
return func(i int) bool {
return v/100 > i
}
})
}

func BenchmarkOnLoop_100_100(b *testing.B) {
benchOnLoop(b, 100, 100, func(v int) func(int) bool {
return func(i int) bool {
return v > i
}
})
}

func BenchmarkOnLoop_200_100(b *testing.B) {
benchOnLoop(b, 200, 100, func(v int) func(int) bool {
return func(i int) bool {
return v/2 > i
}
})
}

func BenchmarkOnLoop_1000_100(b *testing.B) {
benchOnLoop(b, 1000, 100, func(v int) func(int) bool {
return func(i int) bool {
return v/10 > i
b.Run("filter", func(b *testing.B) {
s := append([]int{}, s...)
itb := gcf.FromSlice(s)
itb = gcf.Filter(itb, f13)
itb = gcf.Filter(itb, f11)
itb = gcf.Filter(itb, f7)
b.ResetTimer()
n := 0
for i := 0; i < b.N; i++ {
n = 0
it := itb.Iterator()
for it.MoveNext() {
n++
}
}
})
}

func BenchmarkOnLoop_100_200(b *testing.B) {
benchOnLoop(b, 100, 200, func(v int) func(int) bool {
return func(i int) bool {
return v*2 > i
b.Run("if-func", func(b *testing.B) {
s := append([]int{}, s...)
b.ResetTimer()
n := 0
for i := 0; i < b.N; i++ {
n = 0
for _, v := range s {
if !f13(v) {
continue
}
if !f11(v) {
continue
}
if !f7(v) {
continue
}
n++
}
}
})
}

func BenchmarkOnLoop_100_1000(b *testing.B) {
benchOnLoop(b, 100, 1000, func(v int) func(int) bool {
return func(i int) bool {
return v*10 > i
b.Run("if-inline", func(b *testing.B) {
s := append([]int{}, s...)
b.ResetTimer()
n := 0
for i := 0; i < b.N; i++ {
n = 0
for _, v := range s {
if v%13 == 0 {
continue
}
if v%11 == 0 {
continue
}
if v%7 == 0 {
continue
}
n++
}
}
})
}

func benchOnLoop(b *testing.B, sLen, lpCnt int, f func(int) func(int) bool) {
s := make([]int, sLen)
for i := range s {
s[i] = i + 1
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
sum := 0
for _, v := range s {
if filterOnLoop(f(v), lpCnt) {
sum += v
b.Run("chan", func(b *testing.B) {
s := append([]int{}, s...)
b.ResetTimer()
n := 0
for i := 0; i < b.N; i++ {
n = 0
c13 := make(chan int)
c11 := make(chan int)
c7 := make(chan int)
go func() {
defer close(c13)
for _, v := range s {
if v%13 > 0 {
c13 <- v
}
}
}()
go func() {
defer close(c11)
for v := range c13 {
if v%11 > 0 {
c11 <- v
}
}
}()
go func() {
defer close(c7)
for v := range c11 {
if v%7 > 0 {
c7 <- v
}
}
}()
for range c7 {
n++
}
}
}
}

func filterOnLoop(f func(int) bool, n int) bool {
for i := 0; i < n; i++ {
if !f(i) {
return false
}
}
return true
})
}

0 comments on commit d5a9b8e

Please sign in to comment.