Skip to content

Instantly share code, notes, and snippets.

@kudryashov-sv
Last active November 21, 2018 15:32
Show Gist options
  • Save kudryashov-sv/304d7754c0e37a0684d284ca5c600a0f to your computer and use it in GitHub Desktop.
Save kudryashov-sv/304d7754c0e37a0684d284ca5c600a0f to your computer and use it in GitHub Desktop.
filter_test.go
func FilterJunior(s []int) []int {
var pos = 0
for i := 0; i < len(s); i++ {
if s[i]%3 != 0 {
s[pos] = s[i]
pos++
}
}
return s[:pos]
}
func FilterBob(s []int) []int {
res := s[:0]
for i := range s {
if s[i]%3 != 0 {
res = append(res, s[i])
}
}
return res
}
func FilterPates(s []int) []int {
for i := 0; i < len(s); i++ {
if s[i]%3 == 0 {
s = append(s[:i], s[i+1:]...)
}
}
return s
}
func BenchmarkFilter(b *testing.B) {
in := make([]int, 10000)
for i := range in {
in[i] = rand.Int()
}
b.Run("filter-junior", func(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
FilterJunior(in)
}
})
b.Run("filter-bob", func(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
FilterBob(in)
}
})
b.Run("filter-pates", func(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
FilterPates(in)
}
})
}
// goos: darwin
// goarch: amd64
// pkg: workerpool
// BenchmarkFilter/filter-junior-12 100000 13468 ns/op 0 B/op 0 allocs/op
// BenchmarkFilter/filter-bob-12 100000 14033 ns/op 0 B/op 0 allocs/op
// BenchmarkFilter/filter-pates-12 200000 10222 ns/op 0 B/op 0 allocs/op
// PASS
func TestFilter(t *testing.T) {
require.Equal(t, []int{}, FilterJunior([]int{}))
require.Equal(t, []int{1}, FilterJunior([]int{1}))
require.Equal(t, []int{1, 2}, FilterJunior([]int{1, 2, 3}))
require.Equal(t, []int{1, 2}, FilterJunior([]int{9, 1, 2, 3}))
require.Equal(t, []int{1, 2}, FilterJunior([]int{9, 1, 27, 2, 3}))
require.Equal(t, []int{}, FilterJunior([]int{3}))
require.Equal(t, []int{}, FilterBob([]int{}))
require.Equal(t, []int{1}, FilterBob([]int{1}))
require.Equal(t, []int{1, 2}, FilterBob([]int{1, 2, 3}))
require.Equal(t, []int{1, 2}, FilterBob([]int{9, 1, 2, 3}))
require.Equal(t, []int{1, 2}, FilterBob([]int{9, 1, 27, 2, 3}))
require.Equal(t, []int{}, FilterBob([]int{3}))
require.Equal(t, []int{}, FilterPates([]int{}))
require.Equal(t, []int{1}, FilterPates([]int{1}))
require.Equal(t, []int{1, 2}, FilterPates([]int{1, 2, 3}))
require.Equal(t, []int{1, 2}, FilterPates([]int{9, 1, 2, 3}))
require.Equal(t, []int{1, 2}, FilterPates([]int{9, 1, 27, 2, 3}))
require.Equal(t, []int{}, FilterPates([]int{3}))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment