GoLang Tips: ทดสอบประสิทธิภาพระหว่าง switch กับ else if

วันนี้เราลองมาทำการทดลองว่าการใช้ switch กับ else if อันไหนจะให้ผลลัพธ์ที่ดีกว่ากันนะ

โค๊ดสำหรับทดสอบ

main.go

package boom

import (
"fmt"
"math/rand"
"testing"
)

var words = []string{
"alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta",
"iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", "pi", "rho",
"sigma", "tau", "upsilon", "phi", "chi", "psi", "omega",
}
var wlen = len(words)

func BenchmarkSwitch(b *testing.B) {
m := make(map[string]int)
rand.Seed(376234242)
for i := 0; i < b.N; i++ {
j := rand.Intn(wlen)
s := words[j]
switch s {
case "alpha":
m[s]++
case "beta":
m[s]++
case "gamma":
m[s]++
case "delta":
m[s]++
case "epsilon":
m[s]++
case "zeta":
m[s]++
case "eta":
m[s]++
case "theta":
m[s]++
case "iota":
m[s]++
case "kappa":
m[s]++
case "lambda":
m[s]++
case "mu":
m[s]++
case "nu":
m[s]++
case "xi":
m[s]++
case "omicron":
m[s]++
case "pi":
m[s]++
case "rho":
m[s]++
case "sigma":
m[s]++
case "tau":
m[s]++
case "upsilon":
m[s]++
case "phi":
m[s]++
case "chi":
m[s]++
case "psi":
m[s]++
case "omega":
m[s]++
}
}
var c int
for _,v:=range m{
c=c+v
}
fmt.Printf("%d %d\n", len(m),c)
}

func BenchmarkIf(b *testing.B) {
m := make(map[string]int)
rand.Seed(376234242)
for i := 0; i < b.N; i++ {
j:= rand.Intn(wlen)
w := words[j]
if w == "alpha" {
m[w]++
} else if w == "beta" {
m[w]++
} else if w == "gamma" {
m[w]++
} else if w == "delta" {
m[w]++
} else if w == "epsilon" {
m[w]++
} else if w == "zeta" {
m[w]++
} else if w == "eta" {
m[w]++
} else if w == "theta" {
m[w]++
} else if w == "iota" {
m[w]++
} else if w == "kappa" {
m[w]++
} else if w == "lambda" {
m[w]++
} else if w == "mu" {
m[w]++
} else if w == "nu" {
m[w]++
} else if w == "xi" {
m[w]++
} else if w == "omicron" {
m[w]++
} else if w == "pi" {
m[w]++
} else if w == "rho" {
m[w]++
} else if w == "sigma" {
m[w]++
} else if w == "tau" {
m[w]++
} else if w == "upsilon" {
m[w]++
} else if w == "phi" {
m[w]++
} else if w == "chi" {
m[w]++
} else if w == "psi" {
m[w]++
} else if w == "omega" {
m[w]++
}
}
c:=0
for _,v:=range m{
c=c+v
}
fmt.Printf("%d %d\n", len(m),c)
}

ผลลัพธ์การทดสอบ

go test -bench=.

BenchmarkSwitch-2 1 1
24 100
24 10000
24 1000000
1000000 1203 ns/op
BenchmarkIf-2 1 1
24 100
24 10000
24 1000000
1000000 1214 ns/op

ผลการทดสอบ : Switch vs If ไม่แตกต่างกันมากนะ

คิดและเขียนคือสิ่งที่ผมชอบ ได้ทดลองทำอะไรใหม่ๆ เพื่อนำมาประยุกต์และต่อยอดในเรื่องต่างๆ พร้อมถ่ายทอดเรื่องราวจากชีวิตจริง จากประสบการณ์ จากแนวคิดของผม :)

--

--