gpt4 book ai didi

go - Map delete() 实际上并不删除条目

转载 作者:行者123 更新时间:2023-12-03 01:29:39 24 4
gpt4 key购买 nike

在 map 中进行多次添加/删除后, map 上的测距速度比预期慢。

考虑以下代码

package main

import (
"fmt"
"time"
)

func main() {
test := make(map[int]bool)
for i := 0; i < 1000000; i++ {
test[i] = true
}
for k := range test {
delete(test, k)
}
test[0] = true
fmt.Printf("test len(): %d\n", len(test))
now := time.Now()
for range test {
}
fmt.Printf("range took %v\n", time.Since(now))
}

在我的系统上,循环测试 map (包含 1 个条目)需要 3.5 毫秒。这是一个问题,因为我们在生产中运行类似的代码,一段时间后,每个 map 都有数百万个已删除的条目。

GC似乎没有帮助,我能想到的唯一解决方案是将整个 map 设置为nil,然后重新制作。还有其他方法吗?

最佳答案

我预计性能会根据 map 曾经拥有的最大大小进行粗略缩放,但我不认为随着时间的推移,额外的写入和删除会导致性能变得更糟。有两个组成部分;有时间检查所有存储桶,这将根据 map 曾经拥有的大小进行缩放,以及产生结果的时间,这将根据当前存在的条目数量进行缩放。

但是添加和删除内容不应进一步改变它。

https://play.golang.org/p/Ouj-3MuZvVt

另请参阅https://github.com/golang/go/issues/20135 ,跟踪“ map 删除后不缩小”的问题。

如果您确实需要迭代 map 的一小部分,您可能想要制作一个仅包含您保留的项目的新 map ,但这不是插入/删除花费您的时间,而是花费您时间的最大大小 map 有;请注意,如果您添加和删除 1000 个项目 1000 次,而不是添加 100 万个项目然后删除它们,时间消耗会少多少。

关于go - Map delete() 实际上并不删除条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58475257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com