Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

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

Re: Format-Funktion zu langsam

  Alt 27. Jan 2005, 07:08
Delphi-Quellcode:
procedure TMCBasisExport.Add(AText: string);
var
buf : string ;
begin
     if FS <> nil then begin
         buf := AText+#13#10 ;
         FS.Write(buf[1],length(buf)) ;
     end else begin
         raise exception.Create('Datei kann nich beschrieben werden.');
     end ;
end;
das ist ineffizient und unleserlich.

Delphi-Quellcode:
procedure TMCBasisExport.Add(const AText: String);
const
  CR: PChar = #13#10;
begin
  if FS = nil then
    raise exception.Create('Kein Dateistream erzeugt.');
  FS.Write(PChar(AText)^, Length(AText));
  FS.Write(CR^, 2);
end;
Die Contentation in deinem Source mit Buf := AText + #13#10 führt minimal vier langwierige und unnötige Operationen aus, die du so nicht siehst:

1.) Buf = AText -> setze @Buf^ = @AText^, interner AText.RefCounter +1 erhöhen
2.) Buf = Buf + #13#10
2.1.) alloziere neuen Speicher mit Length(AText) + 4
2.2.) kopiere Inhalt von AText == Buf nach neuen Speicher
2.3.) AText.RefCounter -1
2.4.) setze Buf auf neuen Speicher
2.5.) falls (Length(ABuf) + 4) mod 16 < 2 dann
2.5.1.) alloziere neuen Speicher mit Length(Buf) + 2 um #13#10 hinzufügen zu können
2.5.2.) kopiere nun Buf nach neuen Speicher
2.5.3.) dealloziere alten Speicher im Buf
2.5.4.) setze Buf auf neuen Speicher
2.6.) setze Länge vom String Buf auf ++2
2.7.) kopiere #13#10 ans Ende von Buf
2.8.) Buf.RefCounter -1
2.9.) Speicher in Buf freigeben

All das passiert bei Buf := AText + #13#10;

In meinem Beispiel passiert dagegen folgendes:

0.) nichts, kein unnötiges Stringhandling

Gruß Hagen
  Mit Zitat antworten Zitat