Gut, dieses Beispiel liefert auch schon in Delphi 7 "theoretisch" sehr gute Ergebnisse,
> im Durchschnitt weniger als 10 kopiervorgänge
also nicht nur in neueren Delphi-Versionen.
Delphi-Quellcode:
Var A: Array of String;
i, C: Integer;
P: Pointer;
Begin
A := nil;
C := 0;
P := Pointer(A);
For i := 1 to 50000 do Begin
SetLength(A, i);
If Pointer(A) <> P Then Inc(C);
P := Pointer(A);
End;
MessageBox(0, PChar(Format('%d von %d wurden kopiert', [C, 50000])), '', 0);
End;
Aber das ist nur ein Optimum, da in der Regel noch andere Speicheroperationen zwischendurch stattfinden und somit vermutlich oftmals der Speicher hinter dem Array belegt sein wird, womit es also dann doch nicht so oft Inplace vergrößert werden kann.
Also, im Prinzip stimmt es, daß hier nicht so der rießige Flaschenhals drinsteckt, wie man glauben könnte,
aber dennoch kann man es im Notfall noch optimieren, durch ein größeres Änderungsintervall.
- seltenere Initialisierungen/Finalisierungen der Elemente (je nach Datentyp)
- auch seltenere Zugriffe auf den Speichermanager
- eventuell auch seltenere Realocierungen ... jenachdem wie optimal es der MM normalerweise machen könnte
Es kommt also auf den Einzel fall drauf an, ob man es noch etwas optimieren kann/muß.
Zitat:
aber statt ca 4 mb braucht die tabelle halt 50mb
ram
Stichwort Speicherfragmentierung