登录
首页 >  Golang >  Go问答

验证映射中是否包含存储大值的键

来源:stackoverflow

时间:2024-03-23 14:57:33 495浏览 收藏

在 Go 语言中,使用 `if v, ok := m1[k]; ok { ... }` 检查映射中是否存在键时,如果键 `k` 的值 `v` 很大,会影响效率,因为该方法会将 `v` 加载到内存中。为了提高效率,可以使用 `if _, ok := m1[k]; ok { ... }`,通过使用空白标识符来避免加载值,从而只检查键是否存在。基准测试结果表明,使用空白标识符可以将检查操作的速度提高约十万倍,从约 1 毫秒减少到约 10 纳秒。

问题内容

要知道映射 m1[k]v 中是否存在键 kgo 中非常简单。

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

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

如果 v 很大,使用上述方法仅检查特定键是否存在效率不高,因为它将在内存中加载值 v (即使我按照我的要求使用空白标识符 _ 代替 v )理解,如果我的理解有误,请纠正我)。

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

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


正确答案


使用 if _, ok := m1[k];好的{}。如果您使用空白标识符,则该值将不会被“加载”。

让我们编写基准测试来测试它:

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

如您所见,使用空白标识符,该操作大约需要 10 ns。当我们将值分配给非空标识符时,当值类型的大小约为 8 mb 时,几乎需要 1 毫秒(几乎慢了十万倍)。

本篇关于《验证映射中是否包含存储大值的键》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>