2016-06-29 12 views
4

Ich bin gerade dabei, einige hochgenutzten Code in go zu optimieren. Meine Frage läuft auf das folgende Code-Snippet hinaus (kopiert mit Speicherzuweisungen vom pprof list-Befehl). Wie Sie sehen können, werden alle Zuordnungen in der Zeile vorgenommen, in der die Karte gefüllt wird (Zeile 959).Minimieren Speicherzuweisungen für Go-Karte

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

Hier ist, was ich zu tun versucht: Ich versuche, den Speicher vor der (inneren) Schleife zuzuordnen, so dass keine unnötigen Zuweisungen sind passiert:

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

Warum gibt es Zuweisungen immer noch geschehen in Zeile 968 (zweites Beispiel) und wie kann ich die Karte vor der inneren Schleife richtig zuordnen?

Antwort

8

Eine Karte ist kein Array. Sie können keinen Speicherplatz darin vorbelegen, da Sie nicht wissen können, wo in der Map die Elemente eingefügt werden. In make(map..., X) X ist nur eine Kapazität Hinweis, es bindet nicht die Karte und garantiert definitiv nicht, dass die Schlüssel perfekt darin hascht. Als solches wird es sich bemühen, die Anzahl der zukünftigen Zuweisungen zu minimieren, aber es gibt keine Möglichkeit, sie alle zu eliminieren.

In diesem speziellen Beispiel sollten Sie nur ein Array und nicht eine Karte verwenden, wenn Sie eine perfekte Kontrolle über Zuweisungen haben möchten. Mit einem richtigen Array hätten Sie nur eine Zuweisung.