AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Performancefrage: Viele Änderungen an einem string
Thema durchsuchen
Ansicht
Themen-Optionen

Performancefrage: Viele Änderungen an einem string

Ein Thema von yankee · begonnen am 4. Mär 2007 · letzter Beitrag vom 4. Mär 2007
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 11:18
Hi @ll,

wenn ich einen string sehr langsam verändere/verlängere, zum Beispiel so:
Delphi-Quellcode:
var mystring: string;
begin
mystring :='';
while someCondition() do mystring :=mystring + 'A';
end;
Problem: Ich weiss nicht, wie lang der String werden wird. Ich kann aber sagen, dass der String höchstwahrscheinlich nicht länger als 30 Zeichen wird.
Wenn ich dann dem String eine feste Länge gebe:
var mystring: string[30]; Wie geht Delphi dann vor?
Nicht, dass Delphi immer schon bei
mystring :='';
die feste Länge wieder über den haufen wirft...

Oder wie mache ich das geschickt?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Thorben_K

Registriert seit: 22. Okt 2006
Ort: Darmstadt
105 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 11:29
Delphi schneidet das einfach ab, also wenn du hast

Delphi-Quellcode:
var s : String[8];

begin
  s := '1234567890';
  ShowMessage(s);
end;
Es wird nur '12345678' in der ShowMessage ausgegeben, es gibt auch keine Fehlermeldung

Und die Maximale lände des String bekommst du mit hilfe
  ShowMessage(IntToStr(SizeOf(s) -1)); SizeOf liefert dir die Byte zahl des Strings, Pro zeichen ein Byte und davor steht noch eine Zahl die die länge angibt, diese Zahl musst du abziehen.

Vieleicht kannst du diese zahl auch direkt auslesen, aber so geht es auf jedenfall auch

Thorben
Thorben
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#3

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 11:35
mhh... das heisst ja, ich könnte bei jedem durchlauf der schleife mit length() prüfen, ob der String die maximale Länge ausgereizt hat. Wenn das der Fall ist, kopiere ich den string in einen anderen string mit dynamischer länge und fange wieder von vorne an den string aufzufüllen.

Oder ich nehme immer wieder setlength um den string zu verlängern, wenn die Länge ausgereizt ist. Das hiesse wahrscheinlich, dass ich strings dynamischer Länge nehmen um sie mit setlength verändern zu können.

EDIT: Moment: was macht denn setlength da eigentlich? Length() würde mir dann doch die gesetzte Länge des strings zurückgeben und nicht wieviele Zeichen der string wirklich hat...?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 12:28
Zitat von yankee:
Oder ich nehme immer wieder setlength um den string zu verlängern, wenn die Länge ausgereizt ist. Das hiesse wahrscheinlich, dass ich strings dynamischer Länge nehmen um sie mit setlength verändern zu können.
Exakt. Du erzeugst eined dynamischen String und legst die Maximallänge fest. Wird der String nun verlängert, muss kein zusätzlicher Speicher alloziert werden, solange die tatsächliche Länge unter der Maximallänge liegt.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 12:58
Zitat von Chewie:
Exakt. Du erzeugst eined dynamischen String und legst die Maximallänge fest. Wird der String nun verlängert, muss kein zusätzlicher Speicher alloziert werden, solange die tatsächliche Länge unter der Maximallänge liegt.
Das heisst aber, dass, wenn ich die Länge des stringes sprenge der string weiter verlängert wird oder wird ab dann wieder abgeschnitten? Und wenn nein, wie stelle ich fest, dass ich die länge ausgereizt habe und wieder setlength aufrufen muss? Soll ich mitzählen, wieviele chars ich da reingeschoben habe?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 13:27
Hallo,


Delphi-Quellcode:
var
  mystring: string;
begin
  setlength(mystring, 30);
  zeromemory(@mystring[1], length(mystring));//alles mit #0 füllen
  //length(mystring);//länge von mystring= 30

  mystring[1]:= 'A';//erste Zeichen= 'A'
  //length(mystring);//länge von mystring= 30

  setlength(mystring, 30);
  mystring:= mystring+ 'A';
  length(mystring);//länge von mystring= 31

  mystring:= '';
  //length(mystring);//länge von mystring= 0

  mystring:= '';
  mystring :=mystring + 'A';
  //length(mystring);//länge von mystring= 1

  mystring := 'A';
  mystring :=mystring + 'A';
  //length(mystring);//länge von mystring= 2
Delphi-Quellcode:
var
  mystring: string[3];//alles was länger 3 ist wird ignoriert
begin
  //length(mystring);//länge von mystring= 0

  mystring:= '';
  //length(mystring);//länge von mystring= 0

  mystring:= '';
  mystring :=mystring + 'A';
  //length(mystring);//länge von mystring= 1

  mystring:= 'AAAAAAAAAAAAAAAAAAAAA';
  //länge von mystring trotzdem= 3
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 13:33
Wie sieht es damit aus:
Delphi-Quellcode:
const max=30;
var s:string;
    i:integer;
begin
  setlength(s,max);
  i:=0;
  while something do begin
   inc(i);
   s[i]:='A';
  end;
  setlength(s,i);
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#8

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 14:18
mhh... ist doch alles nicht ganz einfach....
Der Buffer soll sich ja auch noch vergössern, sobald er voll ist. Was halted ihr hiervon:
Delphi-Quellcode:
var buffer: string;
    bufcur,bufend: PChar;
begin
  setlength(buffer, 31);
  bufcur :=@buffer[0];
  bufend :=@buffer[30];
  while someCondition do
  begin
    if bufcur =bufend then
    begin
      setlength(buffer, length(buffer)+10);
      bufend :=@buffer[length(buffer)-1];
      bufcur :=@buffer[length(buffer)-11];
    end;
    bufcur^ :='A';
    inc(bufcur);
  end;
end;
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Performancefrage: Viele Änderungen an einem string

  Alt 4. Mär 2007, 14:26
Auch nicht schlecht. Damit sparst du dir das "IsUniqueString", da du PChar als Zuweisung nimmst. Hat ich auch schon dran gedacht.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:44 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