![]() |
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. |
Re: Große Strings, Performance?
Zitat:
![]() |
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 |
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 :) |
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.
|
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 |
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:
müsste mir doch eine Kopie von altString liefern und nicht wie
neuString := Copy(altString, 1, length(altString));
Delphi-Quellcode:
nur den Zeiger auf den Speicherbereich weitergeben. Oder sehe ich das irgendwie falsch?
neuString := altString;
Wie kann ich denn sonst den String kopieren? |
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. :? |
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: |
Re: Große Strings, Performance?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz