Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Große Strings, Performance? (https://www.delphipraxis.net/70035-grosse-strings-performance.html)

Brainstalker 23. Mai 2006 22:08


Große Strings, Performance?
 
Hallöchen ich hab da mal ne allgemeine Frage.
Was wäre eine gute möglichkeit um Dateien einzulesen?

Im Moment mache ich das mit einer TStringList, was allerdings etwas umständlich ist. Jetzt kam mir die Idee das ganze in einen String einzulesen. Wie sieht es da mit der Performance aus? Is es ratsam die Datei in einen String zu laden/nicht zu laden?
Und dann stellt sich noch die Frage wie es mit der Übergabe an Methoden aussieht. kann es zu Problemen kommen wenn ich sehr große Strings übergebe?

Naja bevor ich jetzt loslege zu coden wollte ich mich vorher informieren, da ich den Klassenaufbau vorher besser planen möchte.

arbu man 23. Mai 2006 22:16

Re: Große Strings, Performance?
 
Zitat:

Was wäre eine gute möglichkeit um Dateien einzulesen?
Delphi-Referenz durchsuchenTFileStream damit kanst du lesen schreiben etc.

negaH 23. Mai 2006 22:18

Re: Große Strings, Performance?
 
Dein "großer" String wird wohl vom Typ LongString sein. Bei der Übergabe solcher Strings an Funktionen wird nur ein Zeiger == 4 Bytes übergeben. Das sollte und ist nicht das Problem. Desweiteren kann ein solcher String sehr sehr groß sein, größer als der verfügbare Hauptspeicher. Wenn also deine Datei wesentlich kleiner ist als der Hauptspeicher spricht rein garnichts dagegen. Du allozierst mit SetLength(String, Stream.Size) erstmal deinen String und lädst die daten dann per Stream.Read(String[1], Stream.Size) in einem Rutsch.
Auf alle Fälle ist diese Variante weit performanter als die TStringList.

Gruß Hagen

himitsu 24. Mai 2006 11:28

Re: Große Strings, Performance?
 
Also ich nehm och recht oft AnsiStrings (WideStrings wären wohl nicht so "performant".
Man könnte auch ein dynamisches Array of Byte, aber ich find den String praktischer, vorallem das Insert/Delete/+ und so.
was vorallem gut datan ist:
* keine klasse dahinet, welche man erzeugen/freigeben muß
und wenn deer String nicht mehr gebraucht wird, dan gibt Delphi (Kompilermagic sei Dank) den auch selber wieder frei ... jedenfalls ist es unter normalen Umständen kaum möglich da ein Speicherleak zu bekommen :)

H4ndy 24. Mai 2006 12:34

Re: Große Strings, Performance?
 
Wenn es nur ums komplette Lesen oder Schreiben einer Datei über Strings geht, dann könntest du auch einen TStringStream benutzen, welcher eine Datei als String abbildet.

Brainstalker 24. Mai 2006 21:59

Re: Große Strings, Performance?
 
Ok hört sich ja gut an das ich das mit den Strings machen kann. Ist dann auch sehr viel einfacher.
TxxxStreams werde ich nicht benutzen, denn ich will mit dem String im Programm schon arbeiten und ich denke es ist die einfachste Möglichkeit.
Das was negaH angesprochen hat hört sich sehr gut an. Werde das dann damit versuchen, werde damit sicherlich noch ein bisschen Geschwindigkeit rausholen. Außerdem kann ich dann den Code mal aufräumen und vereinfachen.

Vielen Dank an alle

Brainstalker 6. Jun 2006 00:05

Re: Große Strings, Performance?
 
Ok jetzt habe ich doch noch ein Problem mit dem Ansistring. Da die Variable ja nur ein Zeiger ist, bringt mir eine einfache Zuweisung ja nichts, wenn ich den String kopieren will. Ok kein Problem denke ich und benutze einfach Copy. Aber irgendwie scheint das auch nichts zu nützen und er verändert mit trotzdem den String von dem ich öfters kopiere.
Mit Copy müsste doch der gesamte Inhalt eines Strings in ein neuen kopiert werden oder sehe ich das falsch?

Delphi-Quellcode:
neuString := Copy(altString, 1, length(altString));
müsste mir doch eine Kopie von altString liefern und nicht wie
Delphi-Quellcode:
neuString := altString;
nur den Zeiger auf den Speicherbereich weitergeben. Oder sehe ich das irgendwie falsch?
Wie kann ich denn sonst den String kopieren?

Luckie 6. Jun 2006 00:14

Re: Große Strings, Performance?
 
Was verstehst du an dieser Stelle unter kopieren? Mit deiner einfachen Zuweisung hast du ihn doch kopiert. Delphi erhöht automatisch den Referenzzähler des Strings. Wenn du dann den Ziel String änderst, ändert sich nichts am original String, denn erst wenn der Zielstring geändert wird, wird auch ein neuner Speicherbereich allozieriert und dem Zielstring zu gewiesen.

Ehrlich gesagt, habe ich mir darum noch nie so den Kopf gemacht und alles schön der Compilermagic überlassen. :?

Brainstalker 6. Jun 2006 00:27

Re: Große Strings, Performance?
 
Das habe ich mir auch gedacht, leider wurde mein Originalstring immer überschrieben. Ich hab jetzt den Fehler gefunden, es lag daran das ich eine Variable umbenannt habe, aber nicht ganz so sorgfältig war. :pale:
Ok dann hab ich doch alles richtig verstanden und kann das Copy weglassen. Naja is schon ein bisschen spät, da übersieht man mal was. Ich wollte den Teil eben schnell noch beenden und hab deswegen voreilig gepostet.
Trotzdem vielen Dank.

P.S. Brauchst dir auch jetzt keinen Kopf drum machen, die Compilermagic funktioniert. :mrgreen:

Bernhard Geyer 6. Jun 2006 06:23

Re: Große Strings, Performance?
 
Zitat:

Zitat von himitsu
Also ich nehm och recht oft AnsiStrings (WideStrings wären wohl nicht so "performant")

Du kannst die Performance bei Widestrings und AnsiStrings erhöhen indem du bei allen Funktione mit String-Übergabe const verwendest. Damit braucht der Compiler bei Widestrings keine Kopie anlegen und bei AnsiStrings kann er sich die Verwaltung und überprüfung der Referenzzählung sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz