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?