golang map和for循环的查找效率对比
测试代码:
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 }
运行测试用例发现数据集比较小的情况下,两种简单的搜索方式基本上没有什么区别,当数据量过大(>1000)时,使用hash进行索引,速度会快很多 (hash和排序后进行快速搜索的效率差不多)
文章来自:http://www.cnblogs.com/zp900704/p/6385650.html