AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Große Strings, Performance?

Ein Thema von Brainstalker · begonnen am 23. Mai 2006 · letzter Beitrag vom 6. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#1

Große Strings, Performance?

  Alt 23. Mai 2006, 23:08
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.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#2

Re: Große Strings, Performance?

  Alt 23. Mai 2006, 23:16
Zitat:
Was wäre eine gute möglichkeit um Dateien einzulesen?
Delphi-Referenz durchsuchenTFileStream damit kanst du lesen schreiben etc.
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: Große Strings, Performance?

  Alt 23. Mai 2006, 23:18
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

Re: Große Strings, Performance?

  Alt 24. Mai 2006, 12:28
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#5

Re: Große Strings, Performance?

  Alt 24. Mai 2006, 13:34
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.
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Große Strings, Performance?

  Alt 24. Mai 2006, 22:59
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
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Große Strings, Performance?

  Alt 6. Jun 2006, 01:05
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?

neuString := Copy(altString, 1, length(altString)); müsste mir doch eine Kopie von altString liefern und nicht wie neuString := altString; nur den Zeiger auf den Speicherbereich weitergeben. Oder sehe ich das irgendwie falsch?
Wie kann ich denn sonst den String kopieren?
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Große Strings, Performance?

  Alt 6. Jun 2006, 01:14
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Große Strings, Performance?

  Alt 6. Jun 2006, 01:27
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.
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.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Große Strings, Performance?

  Alt 6. Jun 2006, 07:23
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
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