交換機的性能考慮這一基準,我們比較映射訪問VS交換機地圖VS中去
var code = []int32{0, 10, 100, 100, 0, 10, 0, 10, 100, 14, 1000, 100, 1000, 0, 0, 10, 100, 1000, 10, 0, 1000, 12}
var mapCode = map[int32]int32{
0: 1,
10: 2,
100: 3,
1000: 4,
}
func BenchmarkMap(b *testing.B) {
success := int32(0)
fail := int32(0)
for n := 0; n < b.N; n++ {
// for each value in code array, do a specific action
for _, v := range code {
c, ok := mapCode[v]
if !ok {
fail++
} else {
success += c
}
}
}
}
func BenchmarkSwitch(b *testing.B) {
success := int32(0)
fail := int32(0)
for n := 0; n < b.N; n++ {
// for each value in code array, do a specific action
for _, v := range code {
switch v {
case 0:
success++
case 10:
success += 2
case 100:
success += 3
case 1000:
success += 4
default:
fail++
}
}
}
}
下面是結果:
BenchmarkMap-2 5000000 277 ns/op 0 B/op 0 allocs/op
BenchmarkSwitch-2 30000000 48.2 ns/op 0 B/op 0 allocs/op
因此,使用地圖似乎比開關方式慢。
目前,我想要使用類似於BenchmarkMap()
,其中地圖訪問 是瓶頸的碼,以優化的功能,但作爲圖是動態生成的我不能使用開關當程序開始時(即,它 可能會根據輸入參數而改變)
有沒有辦法像動態生成的地圖那樣獲得與switch x {}
類似的性能?
我還提到'sort.Search',它是一個使用二分搜索算法在已排序的片段中進行搜索的通用工具。 – kostix
@kostix是的,但在排序的片上使用二進制搜索很可能會比映射查找更差。 – icza
剛剛在我的功能中實現它,並獲得了不錯的30%加速,非常感謝! – felix