방금 비슷한 질문이 있었고이 스레드의 제안 중 일부를 시도하기로 결정했습니다.
3 가지 유형의 조회에 대한 최상의 시나리오와 최악의 시나리오를 벤치마킹했습니다.
- 지도 사용
- 목록을 사용하여
- switch 문 사용
함수 코드는 다음과 같습니다.
func belongsToMap(lookup string) bool {
list := map[string]bool{
"900898296857": true,
"900898302052": true,
"900898296492": true,
"900898296850": true,
"900898296703": true,
"900898296633": true,
"900898296613": true,
"900898296615": true,
"900898296620": true,
"900898296636": true,
}
if _, ok := list[lookup]; ok {
return true
} else {
return false
}
}
func belongsToList(lookup string) bool {
list := []string{
"900898296857",
"900898302052",
"900898296492",
"900898296850",
"900898296703",
"900898296633",
"900898296613",
"900898296615",
"900898296620",
"900898296636",
}
for _, val := range list {
if val == lookup {
return true
}
}
return false
}
func belongsToSwitch(lookup string) bool {
switch lookup {
case
"900898296857",
"900898302052",
"900898296492",
"900898296850",
"900898296703",
"900898296633",
"900898296613",
"900898296615",
"900898296620",
"900898296636":
return true
}
return false
}
최상의 시나리오는 목록에서 첫 번째 항목을 선택하고 최악의 경우 존재하지 않는 값을 사용합니다.
결과는 다음과 같습니다.
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op
BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op
BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op
BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op
BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op
BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
스위치가 끝까지 이기고 최악의 경우가 최상의 경우보다 훨씬 빠릅니다. 지도가 최악이고 목록이 더 가깝습니다.
따라서 도덕은 다음과 같습니다. 정적이고 합리적으로 작은 목록이있는 경우 switch 문을 사용하십시오.