Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Shortstrings fressen mehr speicher als Strings??


Zimond - Fr 16.04.04 18:25
Titel: Shortstrings fressen mehr speicher als Strings??
Zwecks Optimierung wollte ich in meinem Projekt alle Variablen die bestimmte Werte nicht überschreiten durch kleinere Typen ersetzen, sprich alle Strings die definitiv nicht über 255 Zeichen durch Shortstrings erstetzen.

Anschließend war die Speicherverbrauch Anzeige im Task Manager aber horend höher.

Ich habs an einem leeren Projekt getestet mit
var Zeilen : array [1..100000of string;

und dann im formcreate auf nichts gesetzt :


Delphi-Quelltext
1:
2:
for a := 1 to 100000 do 
 zeilen[a] := '';


Mit Strings ist sind etwa 3 Megabyte speicher in Besitzt, aber mit Shortstrings ganze 58 Megabyte.

Vermute ich richtig das Shortstrings unabhängig ihres Inhalts IMMER 256 Bytes Speicher fressen während normale Strings nur so viele Bytes Speicher an sich reissen wie tatsächlich in ihnen steht? Wenn ja macht die Verwendung von shortstrings zur Speicheroptimierung ja gar keinen Sinn.

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt.


tommie-lie - Fr 16.04.04 21:25
Titel: Re: Shortstrings fressen mehr speicher als Strings??
Zimond hat folgendes geschrieben:
Vermute ich richtig das Shortstrings unabhängig ihres Inhalts IMMER 256 Bytes Speicher fressen während normale Strings nur so viele Bytes Speicher an sich reissen wie tatsächlich in ihnen steht?
Jupp, du vermutest richtig.

Zimond hat folgendes geschrieben:
Wenn ja macht die Verwendung von shortstrings zur Speicheroptimierung ja gar keinen Sinn.
So ist es.


Delete - Sa 17.04.04 11:11

Jo Shortstrings machen höchstens in manchen Records Sinn, wenn du sie abspeichern willst, da aber auch besser als z.B. String[5] wenn du schon genau weißt, dass dein String immer höchstens 5 Zeichen haben wird. ShortString an sich, also mit 255 Zeichen ist nicht so praktisch.
Auch bei der Übergabe an Prozeduren sind LongStrings besser, weil sie nur ein Pointer sind und jede beliebige Länge annehmen können.

Positiv könnte man noch anführen, dass sie die CPU bei manchen komplizierten Operationen etwas weniger belasten. Das haben wir hier allerdings vor nicht allzu langer Zeit schon mal durchdiskutiert -> Suchfunktion.


bms - Sa 17.04.04 11:52

Die Sache ist eher geschichtlich zu sehen. Früher, z.B. noch in Delphi1, war der String ein 256 Zeichen-String. Wenn man was längeres haben wollte, dann mußte man was anderes als den normalen String nehmen. Seit Delphi 2 ist es anders. Das was früher String war ist jetzt Shortstrings, das was früher lange Strings waren (ich glaube das waren AnsiString's) sind jetzt die normalen Strings. Wenn Windows auf 64Bit schwengt, dann werden Strings noch länger als die heutigen 2GigaByte.

Aber um nochmal auf dein Problem zurückzukommen: Heute macht es anscheinend kaum noch einer, aber es ist durchaus möglich einem String eine Länge zuzuweisen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  S: String[2];
begin
  S := 'Abc';
  ShowMessage(S);
end;


Das Ergebnis wird Ab sein.

Wenn du also keine 256 Zeichen brauchst, dann kannst du auch nur zwei Zeichen nehmen.


Motzi - Sa 17.04.04 15:04

An dieser Stelle werd ich einfach mal auf mein String-Tutorial verweisen, in dem genau diese Sachen alle genau abgehandelt werde..! :)
http://www.manuel-poeter.de 8)