【发布时间】:2017-06-20 17:22:36
【问题描述】:
您好,我在做一些练习时遇到了这个问题...
假设您有一张容量为 100,000 的地图。
哪个值最有效地在最短的时间内填满整个地图?
我自己运行了一些基准测试,尝试了我能想到的大多数类型,结果排名靠前的是:
Benchmark_Struct-8 200 6010422 ns/op (struct{}{})
Benchmark_Byte-8 200 6167230 ns/op (byte = 0)
Benchmark_Int-8 200 6112927 ns/op (int8 = 0)
Benchmark_Bool-8 200 6117155 ns/op (bool = false)
示例函数:
func Struct() {
m := make(map[int]struct{}, 100000)
for i := 0; i < 100000; i++ {
m[i] = struct{}{}
}
}
如您所见,最快的一个(大部分时间)是struct{}{}类型 - 空结构。
- 但是为什么在 go 中会出现这种情况?
- 是否有更快/更轻的 nil 或非 nil 值?
- 感谢您的宝贵时间 :)
【问题讨论】:
-
我不认为将大量空值添加到从未使用过的地图所花费的时间是常见的用例。您基本上只是在测试用于扩展不同类型地图的机器代码。如果有任何差异,总体内存使用可能与大多数程序更相关。我个人喜欢使用 bool 值,因此不需要
, ok来检查密钥是否存在。 -
有一种情况,它可以派上用场,但它并不那么相关,因为速度差异不是那么大。嗯有趣的一点(关于布尔)。谢谢。
标签: performance go