在Golang中汇集地图

时间:2017-02-19 21:07:21

标签: go hashmap object-pooling

我很好奇是否有人在之前尝试过pool地图?我以前读过关于pooling buffers的内容,我想知道是否通过类似的推理,如果必须经常创建和销毁它们,或者如果有任何理由,先验,它可能不会高效。当一个地图返回到池中时,人们必须遍历它并删除所有元素,但似乎一个受欢迎的建议是create a new map instead of deleting the entries in a map which has already been allocated and reusing it,这让我觉得合并地图可能不那么有用。

2 个答案:

答案 0 :(得分:1)

如果您的地图通过删除或添加条目而改变(大量),这将导致新的分配,并且没有将它们合并的好处。

如果您的地图的大小不会改变,但只有键的值会发生变化,那么合并将是一次成功的优化。

当您读取类似表格的结构(例如CSV文件或数据库表)时,这将很有效。每行将包含完全相同的列,因此您不需要清除任何条目。

以下基准测试显示使用library(reshape2) library(ggplot2) test <- abs(rnorm(12)*1000) test <- rbind(test, test+500) colnames(test) <- month.abb[seq(1:12)] rownames(test) <- c("first", "second") otherTest <- apply(test, 2, mean) test <- melt(test) otherTest <- data.frame( Var2 = names(otherTest), value = otherTest ) otherTest$Var2 = factor(otherTest$Var2, levels = levels(test$Var2)) ggplot(test, aes(x = Var2, y = value, group = 1)) + geom_bar(aes(fill = Var1), stat="identity") + geom_line(data = otherTest) 运行

时无分配
go test -benchmem -bench .

答案 1 :(得分:1)

就像@GrzegorzŻur所说,如果您的地图的大小没有太大变化,那么汇集是有帮助的。为了测试这一点,我做了一个基准测试,其中池化胜出。我机器上的输出是:

a
You entered : a
You entered : 

基准代码:

Pool time: 115.977µs
No-pool time: 160.828µs