jer*_*roe 4 hashmap go object-pooling
我很好奇之前是否有人尝试过在 Go 中池化地图?我之前读过有关池化缓冲区的内容,我想知道通过类似的推理,如果必须频繁创建和销毁它们,或者是否有任何原因,先验地认为池化映射可能效率不高,那么池化映射是否有意义。当映射返回到池中时,必须迭代它并删除所有元素,但似乎流行的建议是创建一个新映射,而不是删除已分配的映射中的条目并重用它让我觉得池化地图可能没有那么有益。
如果您的映射通过删除或添加条目而改变(很多)大小,这将导致新的分配,并且池化它们不会有任何好处。
如果您的映射的大小不会改变,而只有键的值会改变,那么池化将是一个成功的优化。
当您读取类似表格的结构(例如 CSV 文件或数据库表)时,这会很有效。每行将包含完全相同的列,因此您无需清除任何条目。
下面的基准测试显示使用go test -benchmem -bench .to运行时没有分配
package mappool
import "testing"
const SIZE = 1000000
func BenchmarkMap(b *testing.B) {
m := make(map[int]int)
for i := 0; i < SIZE; i++ {
m[i] = i
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
for i := 0; i < SIZE; i++ {
m[i] = m[i] + 1
}
}
}
Run Code Online (Sandbox Code Playgroud)