【问题标题】:Which is the most efficient nil value?哪个是最有效的零值?
【发布时间】: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


【解决方案1】:

理论上,struct{}{} 应该是最有效的,因为它不需要内存。在实践中,a) 结果可能因 Go 版本、操作系统和系统架构而异; b) 我想不出任何与最大化空值的执行时间效率相关的情况。

【讨论】:

  • 我同意这不是与现实生活应用最相关的问题。但我发现它很有趣,因为我期望 byte=0 是最快的。有时我喜欢摆弄语言。感谢您的建设性回答:)
  • byte=0 需要 8 位存储 struct{}{} 需要 0。管理 8 位 x N 次出现通常比管理 0 位 x N 次出现效率低。
  • @Flimzy:因为 hashmap 不希望有完整的桶(Go 中的 const 负载因子是 6.5),桶的开销几乎弥补了 bool (其中反正是直接装进桶里)和struct{}。虽然内存使用量仍然存在 5-6% 的小差异(至少我上次进行数学计算是在几个版本之前),但您不能说在地图中使用 N struct{} 值可以节省你N字节。
  • @Jimb 这是一些有趣的信息,谢谢分享。除了struct{},还有其他在go中使用0位的类型吗?
  • @Mihailo 所有长度为 0 的数组类型,例如[0]byte[0]int
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 2013-02-23
  • 2020-11-16
  • 2019-07-12
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多