2017-06-20 47 views
0

嗨,做一些练习我碰到过这个问题...
可以说你有一张容量为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{}{} 
    } 
} 

正如你所看到的最快的一个(大部分时间)是01型- 空结构。

  • 但为什么在这种情况下
  • 是否有更快/更轻的零值或非零值?


- 感谢您的时间:)

+4

我不认为将大量空值添加到从未使用过的地图是一种常见用例。您基本上只是测试用于扩展不同类型地图的机器代码。如果存在任何差异,整体内存使用情况_might_对于大多数程序更为相关。我个人喜欢有一个bool值,所以'',ok'不需要检查密钥的存在。 – JimB

+0

Theres这种情况下,它可以有用的,但它不相关,因为速度差异并不大。嗯有趣的一点(关于bools)。谢谢。 – Mihailo

回答

4

从理论上讲,应该struct{}{}是最有效的,因为它不需要记忆。在实践中,a)Go版本,操作系统和系统架构的结果可能会有所不同;和b)我想不出任何最大限​​度地提高空值执行时间效率的情况。

+0

我同意它不是Real-Life Apps最相关的问题。但是我发现它很有趣,因为我期望字节= 0是最快的。我不时喜欢用这种语言来捣鼓。谢谢你的建设性答案:) – Mihailo

+0

'byte = 0'需要8位存储'struct {} {}'需要0.管理8位x N次出现的次数通常比管理0位x次出现次数少。 – Flimzy

+1

@Flimzy:因为hashmap并不想要完整的桶(在Go中的const加载因子是6.5),桶的开销几乎弥补了'bool'之间的任何差异(无论如何都直接打包到桶中)和'struct {}'。尽管内存使用率仍有5-6%的差异(至少上次我做了数学,这是几次发布前),但您不能说在一个数组中使用了N'struct {}'值地图保存你的'N'字节。 – JimB

相关问题