golang 中map 和slice 索引速度比较

本文通过Go语言实现的查找算法,对比了切片(slice)与映射(map)在不同数据规模下的性能。实验结果显示,在小规模数据(100条)下,映射的查找速度略快于切片;但在大规模数据(100万条)下,切片的查找速度优势明显。此外,还提出了一种将10^6级别的查找优化为三次10^2级别查找的方法。

主文件

package main

var max = 100
var Slice = make([]int, max+10)
var Map = make(map[int]int)

func init() {
	for i := 0; i < max; i++ {
		Slice[i] = i
		Map[i] = i
	}
}

// 查找算法可以优化,本文对于常用无序查找做比较
func SearchSlice(i int) int {
	for _, v := range Slice {
		if v == i {
			return v
		}
	}
	return -1
}

func SearchMap(i int) int {
	return Map[i]
}

测试文件

package main

import "testing"

func BenchmarkSearchMap(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = SearchMap(i % max)
	}
}

func BenchmarkSearchSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = SearchSlice(i % max)
	}
}

func BenchmarkSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = Slice[i%max]
	}
}

测试结果

max = 100

BenchmarkSearchMap-16           94148293                12.7 ns/op             0 B/op          0 allocs/op
BenchmarkSearchSlice-16         49473447                23.6 ns/op             0 B/op          0 allocs/op
BenchmarkSlice-16               187461336                6.46 ns/op            0 B/op          0 allocs/op

max = 10000

BenchmarkSearchMap-16           43147364                27.6 ns/op             0 B/op          0 allocs/op
BenchmarkSearchSlice-16           968623              1159 ns/op               0 B/op          0 allocs/op
BenchmarkSlice-16               187649472                6.42 ns/op            0 B/op          0 allocs/op

Max = 1000000

BenchmarkSearchMap-16                   15015690                90.1 ns/op             0 B/op          0 allocs/op
BenchmarkSearchSlice-16                   441436            104242 ns/op               0 B/op          0 allocs/op
BenchmarkSlice-16                       182620702                6.58 ns/op            0 B/op          0 allocs/op

在一些特定优化条件下,可以尝试用slice,效果会比map好,比如把10 6级的查找优化成3级102查找, 对于一些结构体,可以根据某些特征分类或预先根据特征值排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值