交换机的性能考虑这一基准,我们比较映射访问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