Ich habe eine Wahl.
Ich habe eine Reihe von bereits bestellten Zeichenfolgen, die ich speichern und abrufen muss. Es sieht so aus, als ob ich wählen kann zwischen der Verwendung von:
-
A TStringList
-
Ein dynamisches Array von Zeichenketten, und
-
Eine verknüpfte Liste von Zeichenketten (einfach verknüpft)
und Alan schlug in seinem Kommentar vor, dass ich auch die Auswahl ergänzen sollte:
-
TList<string>
Unter welchen Umständen ist jede dieser Möglichkeiten besser als die anderen?
Was eignet sich am besten für kleine Listen (unter 10 Einträge)?
Was eignet sich am besten für große Listen (über 1000 Einträge)?
Was eignet sich am besten für große Listen (über 1.000.000 Einträge)?
Was ist das Beste, um den Speicherverbrauch zu minimieren?
Was ist das Beste, um die Ladezeit zu minimieren und zusätzliche Elemente am Ende hinzuzufügen?
Was ist am besten geeignet, um die Zugriffszeit für den Zugriff auf die gesamte Liste vom Anfang bis zum Ende zu minimieren?
Welche Datenstruktur wäre auf dieser (oder einer anderen) Grundlage vorzuziehen?
Als Referenz verwende ich Delphi 2009.
Dimitry sagte in einem Kommentar:
Beschreiben Sie Ihre Aufgabe und Ihr Datenzugriffsmuster, dann ist es möglich, Ihnen eine genaue Antwort zu geben
Okay. Ich habe ein Genealogieprogramm mit vielen Daten.
Für jede Person habe ich eine Reihe von Ereignissen und Attributen. Ich speichere sie als kurze Textstrings, aber es gibt viele davon für jede Person, von 0 bis zu einigen hundert. Und ich habe Tausende von Personen. Ich brauche keinen zufälligen Zugriff auf sie. Ich brauche sie nur als eine Anzahl von Zeichenketten in einer bekannten Reihenfolge, die jeder Person zugeordnet sind. Dies ist mein Fall von Tausenden von "kleinen Listen". Das Laden dieser Listen nimmt Zeit in Anspruch und beansprucht Speicherplatz, und der Zugriff auf sie ist zeitaufwändig, wenn ich sie alle benötige (z. B. um den gesamten erstellten Bericht zu exportieren).
Dann habe ich noch ein paar größere Listen, z. B. alle Namen der Abschnitte meiner "virtuellen" Baumansicht, die Hunderttausende von Namen haben kann. Auch hier brauche ich nur eine Liste, auf die ich per Index zugreifen kann. Diese werden aus Gründen der Effizienz getrennt von der Baumansicht gespeichert, und die Baumansicht ruft sie nur bei Bedarf ab. Das Laden dauert eine Weile und ist für mein Programm sehr speicherintensiv. Aber ich muss mir keine Gedanken über die Zugriffszeit machen, da immer nur auf einige wenige Daten gleichzeitig zugegriffen wird.
Ich hoffe, das gibt Ihnen eine Vorstellung davon, was ich zu erreichen versuche.
p.s. Ich habe hier bei StackOverflow eine Menge Fragen zur Optimierung von Delphi gestellt. Mein Programm liest 25 MB große Dateien mit 100.000 Personen und erstellt Datenstrukturen, einen Bericht und eine Baumansicht für sie in 8 Sekunden, verbraucht dabei aber 175 MB RAM. Ich arbeite daran, das zu reduzieren, weil ich Dateien mit mehreren Millionen Personen in 32-Bit-Windows laden möchte.
Ich habe gerade einige ausgezeichnete Vorschläge zur Optimierung einer TList bei dieser StackOverflow-Frage gefunden: Gibt es eine schnellere TList-Implementierung?