2016-06-29 3 views
4

現在、よく使われているコードをgoで最適化しています。私の質問は、次のコードスニペット(pprof listコマンドのメモリ割り当てでコピーされています)に至りました。あなたが見ることができるように、すべての割り当ては、マップが満たされている行(行959)で行われます。go mapのメモリ割り当てを最小限にする

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:} 
私がやろうとしています何をここで

:まだそこに起こって配分されているのはなぜ

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

:私は起こって不要な割り当てが存在しないので、(内部)ループの前にメモリを割り当てるしようとしています968行目(2番目のサンプル)、内部ループの前にマップを正しく割り当てるにはどうすればよいですか?

答えて

8

マップは配列ではありません。要素がマップ内のどこに挿入されるかわからないため、スペースを事前に割り当てることはできません。 make(map..., X)では、Xはちょうど容量ヒントであり、地図を縛ることはなく、キーが完全にハッシュされることを保証するものではありません。したがって、将来の割り当ての数を最小限に抑えるために最善の努力をしますが、それらのすべてを排除する方法はありません。

割り振りを完全に制御したい場合は、この特定の例では、マップではなく配列を使用してください。適切な配列を使用すると、割り当てが1つだけになります。

関連する問題