检查存储大值的映射中是否存在键



要知道映射M1[k]v中存在密钥k,在Go中非常简单。

if v, ok := M1[k]; ok {
    // key exist
}

'v':非指针类型的值。

如果v很大,使用上述方法仅检查特定密钥是否存在是无效的,因为它会在内存中加载值v(根据我的理解,即使我使用空白标识符_代替v,如果我的理解有误,请纠正我(。

是否有一种有效的方法可以检查Map中是否存在键(无需读取/或在内存中分配值(?

我正在考虑创建一个新的映射M2[k]bool来存储信息,并在每次在M1中插入内容时在M2中进行条目。

使用if _, ok := M1[k]; ok { }。如果使用空白标识符,则该值将不是"0";加载";。

让我们编写测试基准:

var m = map[int][1_000_000]int64{
    1: {},
}
func BenchmarkNonBlank(b *testing.B) {
    for i := 0; i < b.N; i++ {
        if v, ok := m[1]; ok {
            if false {
                _ = v
            }
        }
    }
}
func BenchmarkBlank(b *testing.B) {
    for i := 0; i < b.N; i++ {
        if _, ok := m[1]; ok {
            if false {
                _ = ok
            }
        }
    }
}

运行go test -bench .,输出为:

BenchmarkNonBlank-8         1497            763278 ns/op
BenchmarkBlank-8        97802791                12.09 ns/op

正如您所看到的,使用空白标识符,操作大约需要10ns。当我们将值分配给非空白标识符时,当值类型的大小约为8MB时,它几乎是1ms(几乎慢了十万倍(。

相关内容

  • 没有找到相关文章

最新更新