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和排序后进行快速搜索的效率差不多)

posted @ 2017-02-10 11:38  zhao379028604  阅读(1321)  评论(0编辑  收藏  举报