测试代码:
<pre class="brush:go;gutter:true;">package main
import (
"encoding/json"
"fmt"
"math/rand"
"strconv"
"testing"
"time"
)
func TestMap(t *testing.T) {
num := 100
testdata := initTestData(num)
random := rand.New(rand.NewSource(time.Now().UnixNano()))
searchs := make([]int, num)
for i := 0; i < num; i {
searchs[i] = int(random.Int31n(int32(num)))
}
find := true
t.Log(find)
start := time.Now()
hash := make(map[int]*TestStruct, num)
for i := 0; i < num; i {
hash[testdata[i].Id] = testdata[i]
}
for _, item := range searchs {
_, has := hash[item]
find = has
}
end := time.Now()
t.Log("cost:", end.UnixNano()-start.UnixNano())
start = time.Now()
for _, item := range searchs {
for _, data := range testdata {
if item == data.Id {
find = true
break
}
}
}
end = time.Now()
t.Log("cost:", end.UnixNano()-start.UnixNano())
}
type TestStruct struct {
Id int
No string
}
func initTestData(num int) []*TestStruct {
result := make([]*TestStruct, num)
for i := 0; i < num; i {
result[i] = &TestStruct{
Id: i 1,
No: strconv.Itoa(i 1),
}
}
return result
}
</pre>
运行测试用例发现数据集比较小的情况下,两种简单的搜索方式基本上没有什么区别,当数据量过大(>1000)时,使用hash进行索引,速度会快很多 (hash和排序后进行快速搜索的效率差不多)