Skip to content

Instantly share code, notes, and snippets.

@rkt2spc
Last active May 30, 2019 18:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rkt2spc/fa77e29c4d0c51451d3c0e7ab9d0d13b to your computer and use it in GitHub Desktop.
Save rkt2spc/fa77e29c4d0c51451d3c0e7ab9d0d13b to your computer and use it in GitHub Desktop.
Which lookup method is faster on small dataset? switch or if or map?

Lookup Benchmark Results

$ go test -bench=. -benchtime=5s 
goos: darwin
goarch: amd64
pkg: github.com/rocketspacer/lookupbm
BenchmarkLookUp/ValueExists@Head/Switch-8       1000000000               6.39 ns/op
BenchmarkLookUp/ValueExists@Head/IfElse-8       10000000000              1.86 ns/op
BenchmarkLookUp/ValueExists@Head/Map-8          1000000000               9.86 ns/op
BenchmarkLookUp/ValueExists@End/Switch-8        1000000000               7.28 ns/op
BenchmarkLookUp/ValueExists@End/IfElse-8        1000000000               6.00 ns/op
BenchmarkLookUp/ValueExists@End/Map-8           1000000000              10.6 ns/op
BenchmarkLookUp/ValueDoesntExist/Switch-8       2000000000               3.93 ns/op
BenchmarkLookUp/ValueDoesntExist/IfElse-8       2000000000               6.00 ns/op
BenchmarkLookUp/ValueDoesntExist/Map-8          500000000               13.2 ns/op
PASS
ok      github.com/rocketspacer/lookupbm 91.962s
$ go test -bench=. -benchtime=5s
goos: darwin
goarch: amd64
pkg: github.com/rocketspacer/lookupbm
BenchmarkLookUp/ValueExists@Head/Switch-8       1000000000               6.39 ns/op
BenchmarkLookUp/ValueExists@Head/IfElse-8       10000000000              1.88 ns/op
BenchmarkLookUp/ValueExists@Head/Map-8          1000000000               9.78 ns/op
BenchmarkLookUp/ValueExists@End/Switch-8        1000000000               6.53 ns/op
BenchmarkLookUp/ValueExists@End/IfElse-8        1000000000               6.34 ns/op
BenchmarkLookUp/ValueExists@End/Map-8           1000000000              10.8 ns/op
BenchmarkLookUp/ValueDoesntExist/Switch-8       2000000000               3.93 ns/op
BenchmarkLookUp/ValueDoesntExist/IfElse-8       2000000000               6.02 ns/op
BenchmarkLookUp/ValueDoesntExist/Map-8          500000000               12.8 ns/op
PASS
ok      github.com/rocketspacer/lookupbm 91.421s
$ go test -bench=. -benchtime=5s
goos: darwin
goarch: amd64
pkg: github.com/rocketspacer/lookupbm
BenchmarkLookUp/ValueExists@Head/Switch-8       1000000000               6.31 ns/op
BenchmarkLookUp/ValueExists@Head/IfElse-8       10000000000              1.79 ns/op
BenchmarkLookUp/ValueExists@Head/Map-8          1000000000               9.35 ns/op
BenchmarkLookUp/ValueExists@End/Switch-8        1000000000               6.33 ns/op
BenchmarkLookUp/ValueExists@End/IfElse-8        2000000000               5.95 ns/op
BenchmarkLookUp/ValueExists@End/Map-8           1000000000              11.7 ns/op
BenchmarkLookUp/ValueDoesntExist/Switch-8       2000000000               3.91 ns/op
BenchmarkLookUp/ValueDoesntExist/IfElse-8       2000000000               5.85 ns/op
BenchmarkLookUp/ValueDoesntExist/Map-8          500000000               12.5 ns/op
PASS
ok      github.com/rocketspacer/lookupbm 96.056s
package lookup_test
import "testing"
var globalMap = map[string]bool{
"GET": true,
"HEAD": true,
"POST": true,
"PUT": true,
"DELETE": true,
"CONNECT": true,
"OPTIONS": true,
"TRACE": true,
"PATCH": true,
}
func noop() {
a := 1
_ = a + 1
}
func doSwitchLookup(value string) {
switch value {
case "GET":
noop()
case "HEAD":
noop()
case "POST":
noop()
case "PUT":
noop()
case "DELETE":
noop()
case "CONNECT":
noop()
case "OPTIONS":
noop()
case "TRACE":
noop()
case "PATCH":
noop()
default:
noop()
}
}
func doIfElseLookup(value string) {
if value == "GET" {
noop()
} else if value == "HEAD" {
noop()
} else if value == "POST" {
noop()
} else if value == "PUT" {
noop()
} else if value == "DELETE" {
noop()
} else if value == "CONNECT" {
noop()
} else if value == "OPTIONS" {
noop()
} else if value == "TRACE" {
noop()
} else if value == "PATCH" {
noop()
} else {
noop()
}
}
func doMapLookup(value string) {
_ = globalMap[value]
noop()
}
func BenchmarkLookUp(b *testing.B) {
b.Run("ValueExists@Head", func(b *testing.B) {
value := "GET"
b.Run("Switch", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doSwitchLookup(value)
}
})
b.Run("IfElse", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doIfElseLookup(value)
}
})
b.Run("Map", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doMapLookup(value)
}
})
})
b.Run("ValueExists@End", func(b *testing.B) {
value := "PATCH"
b.Run("Switch", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doSwitchLookup(value)
}
})
b.Run("IfElse", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doIfElseLookup(value)
}
})
b.Run("Map", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doMapLookup(value)
}
})
})
b.Run("ValueDoesntExist", func(b *testing.B) {
value := "LOOKATME"
b.Run("Switch", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doSwitchLookup(value)
}
})
b.Run("IfElse", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doIfElseLookup(value)
}
})
b.Run("Map", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doMapLookup(value)
}
})
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment