Memory 最小化go map的内存分配

Memory 最小化go map的内存分配,memory,optimization,go,Memory,Optimization,Go,我目前正在研究优化go中一些高度使用的代码。我的问题归结为以下代码段(使用pprof list命令中的内存分配复制)。正如您所看到的,所有分配都在地图填充的行中完成(第959行) 例程======================================cart.benchmarkmap在/../cart\u test.go中没有CapacityFixval 3328966 3328966(公寓,兼)占总数的15.50% . . 954: . .

我目前正在研究优化go中一些高度使用的代码。我的问题归结为以下代码段(使用pprof list命令中的内存分配复制)。正如您所看到的,所有分配都在地图填充的行中完成(第959行)

例程======================================cart.benchmarkmap在/../cart\u test.go中没有CapacityFixval
3328966 3328966(公寓,兼)占总数的15.50%
.          .    954:
.          .    955:func BenchmarkMapWithOutCapacityFixVal(b*testing.b){
…956:对于i:=0;i
以下是我试图做的:我试图在(内部)循环之前分配内存,这样就不会发生不必要的分配:

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:}
例程================================cart.BenchmarkMapWithCapacityFixVal in/../cart\u test.go
3214263 3214263(平房,兼)占总数的14.97%
.          .    963:
.          .    964:func BenchmarkMapWithCapacityFixVal(b*testing.b){
…965:对于i:=0;i

为什么第968行(第二个示例)中仍有分配,如何在内部循环之前正确分配映射?

映射不是数组。您无法预先分配其中的空间,因为您不知道元素将在地图中的何处插入。在
make(map…,X)
X只是一个容量提示,它不会绑定映射,也肯定不能保证密钥会完美地散列到映射中。因此,它将尽最大努力减少未来分配的数量,但无法消除所有分配

在这个特定的例子中,如果您想要完美地控制分配,您应该只使用数组而不是映射。有了一个合适的数组,您只需要一次分配

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:}