dqsh30374 2016-06-29 09:15
浏览 115
已采纳

最小化go map的内存分配

I am currently digging into optimising some highly used code in go. My Question boils down to the following code snippet (copied with memory allocations from pprof list command). As you can see all the allocations are done in the line where map is being filled (line 959).

ROUTINE ======================== cart.BenchmarkMapWithOutCapacityFixVal in /.../cart_test.go
   3328966    3328966 (flat, cum) 15.50% of Total
         .          .    954:
         .          .    955:func BenchmarkMapWithOutCapacityFixVal(b *testing.B) {
         .          .    956:   for i := 0; i < b.N; i++ {
         .          .    957:       m := make(map[int]float32)
         .          .    958:       for k := 0; k < 10; k++ {
   3328966    3328966    959:           m[k] = 0.434295723423
         .          .    960:       }
         .          .    961:   }
         .          .    962:}

Here what I am trying to do: I am trying to allocate the memory before the (inner) loop so there are no unnecessary allocations happening:

ROUTINE ======================== cart.BenchmarkMapWithCapacityFixVal in /.../cart_test.go
   3214263    3214263 (flat, cum) 14.97% of Total
         .          .    963:
         .          .    964:func BenchmarkMapWithCapacityFixVal(b *testing.B) {
         .          .    965:   for i := 0; i < b.N; i++ {
   3048075    3048075    966:       m := make(map[int]float32, 10)
         .          .    967:       for k := 0; k < 10; k++ {
    166188     166188    968:           m[k] = 0.434295723423
         .          .    969:       }
         .          .    970:   }
         .          .    971:}

Why are there still allocations happening in line 968 (second sample) and how can I correctly allocate the map before the inner loop?

  • 写回答

1条回答 默认 最新

  • douyiavxxh02727 2016-06-29 09:21
    关注

    A map is not an array. You can't preallocate space in it because you can't know where in the map the elements will be inserted. In make(map..., X) X is just a capacity hint, it doesn't bound the map and definitely doesn't guarantee that the keys will hash perfectly into it. As such it will do a best effort of minimizing the number of future allocations, but there's no way to eliminate all of them.

    In this particular example you should just use an array rather than a map if you want perfect control over allocations. With a proper array you'd have just one allocation.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)