GolangNote

Golang笔记

Golang slice 和 map 的查询性能比较

Permalink

下面是 Golang slice 和 map 的查询性能比较代码

Go: slice 和 map 的查询性能比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main

import (
	"fmt"
	"math/rand"
	"time"
)

const maxSize = 50
const tests = 20000000
const findMult = 1 //9999999999 // 100 = 1% hit rate, 1 = 100% hit rate.

type lst []int

func (l lst) has(xxxx int) bool {
	for _, i := range l {
		if i == xxxx {
			return true
		}
	}
	return false
}

type mp map[int]struct{}

func (m mp) has(xxxx int) bool {
	_, ok := m[xxxx]
	return ok
}

func main() {
	rand.Seed(time.Now().UnixNano())

	for size := 1; size < maxSize; size++ {
		l := make(lst, 0, size)
		m := make(mp, size)
		for i := 0; i < size; i++ {
			e := rand.Int()
			l = append(l, e)
			m[e] = struct{}{}
		}

		found := 0
		start := time.Now()
		for x := 0; x < tests; x++ {
			xxxx := rand.Intn(size * findMult)
			if l.has(xxxx) {
				found++
			}
		}
		sliceDuration := time.Now().Sub(start)

		start = time.Now()
		for x := 0; x < tests; x++ {
			xxxx := rand.Intn(size * findMult)
			if m.has(xxxx) {
				found++
			}
		}
		mapDuration := time.Now().Sub(start)

		// Do something with found so it doesn't get optimized away.
		if found > 0 {
			rand.Int()
		}

		fmt.Printf("%d\t%v\n", size, sliceDuration-mapDuration)
	}
}

输出:

plaintext: slice 和 map 的查询性能比较结果输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1	-209.706862ms
2	-286.768577ms
3	-253.643371ms
4	-184.176088ms
5	-188.898868ms
6	-194.644208ms
7	-113.719066ms
8	-501.892168ms
9	-34.573439ms
10	-380.242983ms
11	-216.931934ms
12	-631.616472ms
13	-135.392189ms
14	-229.107952ms
15	-114.9351ms
16	-373.97338ms
17	-287.007278ms
18	-34.734517ms
19	-237.892748ms
20	-222.025115ms
21	-140.869821ms
22	13.382928ms
23	-341.238616ms
24	-281.6694ms
25	70.841324ms
26	63.31161ms
27	-179.818415ms
28	-30.357644ms
29	39.261291ms
30	-50.066403ms
31	-75.68084ms
32	113.281835ms
33	119.597633ms
34	222.476972ms
35	-89.222024ms
36	95.265413ms
37	164.569075ms
38	150.392782ms
39	247.403261ms
40	365.580116ms
41	284.544515ms
42	275.936162ms
43	330.8626ms
44	428.790859ms
45	94.745088ms
46	388.334553ms
47	189.708983ms
48	387.604493ms
49	308.960719ms

结论

25 个元素以下的用 slice 性能比 map 好

摘自 "Slice vs map for set in golang" https://blog.dubbelboer.com/2015/08/15/slice-vs-map.html

本文网址: https://golangnote.com/topic/224.html 转摘请注明来源

Related articles

Golang Range 的性能提升Tip

Go 语言里使用 range 可以方便遍历数组(array)、切片(slice)、字典(map)和信道(chan)。这里主要关注他们的性能。...

Golang 泛型性能初识

编程时,我们通常需要编写“泛型”函数,其中确切的数据类型并不重要。例如,您可能想编写一个简单的函数来对数字进行求和。Go 直到最近才有这个概念,但最近才添加了它(从1.18版开始)。...

Write a Comment to "Golang slice 和 map 的查询性能比较"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.20 Processed in 1ms