2 Stimmen

Wie wirkt sich die Umstellung von Delphi 2009 auf Unicode (/UTF16) auf die Größe der ausführbaren Datei und den Speicherbedarf aus (wenn überhaupt)?

Hier ist eine Frage aus der Abteilung "Keine Frage ist zu dumm":

Nun, wie das Thema sagt: Gibt es eine Auswirkung? Wenn ja, wie stark? Werden all die String-Literale, die ich in meinem Code und in meinen DFM-Ressourcen habe, jetzt doppelt so viel Platz in den kompilierten Binärdateien einnehmen? Wie sieht es mit der Speichernutzung zur Laufzeit von kompilierten Anwendungen aus? Werden alle String-Variablen jetzt doppelt so viel Arbeitsspeicher beanspruchen? Sollte ich mir überhaupt die Mühe machen?

Ich erinnere mich, dass diese Frage in einem der frühen Webcasts vor der Veröffentlichung gestellt wurde, aber ich kann mich nicht mehr an die Antwort erinnern. Und da die Testphase nur 14 Tage dauert, werde ich es nicht einfach selbst ausprobieren, bevor die Bibliotheken von Drittanbietern, die ich benötige, aktualisiert worden sind (angeblich in etwa einem Monat).

1 Stimmen

Im Code verwendete String-Literale werden in dem Kontext interpretiert, in dem sie tatsächlich verwendet werden, und werden dann entsprechend in die ausführbaren Daten kodiert. Mit anderen Worten, wenn ein Stringliteral einem AnsiString zugewiesen wird, wird es als Ansi kodiert. Wenn ein Literal einem UTF8String zugewiesen wird, wird es als UTF-8 kodiert. Wenn ein Literal einem UnicodeString zugewiesen wird, wird es als UTF-16 kodiert.

0 Stimmen

Der DFM unterstützt UTF-8, und das schon seit vielen Jahren. Unicode-Zeichenfolgen können entweder als UTF-8 oder UTF-16 kodiert werden.

1 Stimmen

UnicodeString-Variablen benötigen zur Laufzeit doppelt so viel RAM, ja. AnsiString, UTF8String und andere Ansi-basierte Variablen nicht.

1voto

Craig Stuntz Punkte 124703

D2009 verwendet UTF-16 als Standard-Zeichenkettentyp, obwohl Sie Variablen bei Bedarf in UTF-8 umwandeln können.

Jan Goyvaerts erörtert den Kompromiss zwischen Größe und Geschwindigkeit in einem guten Blogbeitrag.

String-Literale in DFMs sind seit mindestens D7 UTF-8. Daher wird die Größe von Strings in DFMs mit D2009 nicht zunehmen.

0voto

Oliver Giesen Punkte 8859

Ich habe nun endlich Delphi 2009 in die Hände bekommen und nachdem ich die notwendigen Anpassungen vorgenommen habe, kompiliert mein Projekt nun und läuft einwandfrei :)

Um schnell Ergebnisse zu erhalten, musste ich zunächst ein etwas komplexeres Modul der Anwendung auskommentieren, so dass es noch nicht 100%ig vergleichbar ist, aber es scheint bereits sicher genug zu sein, um vorauszusagen, dass trotz einer beträchtlichen Menge an String-Literalen in unserem Quellcode (übermäßige Debug-Protokollmeldungen) die Größe der mit Delphi 2009 kompilierten Binärdatei wahrscheinlich ungefähr gleich groß sein wird wie vorher - wenn nicht sogar kleiner!

Ich frage mich, ob der Delphi-Compiler tatsächlich irgendeine Art von Komprimierung der Binärdateien oder zumindest der Ressourcenabschnitte durchführt. Ich hätte eigentlich erwartet, dass die Umstellung auf UTF-16-Stringliterale in dieser speziellen Anwendung größere Auswirkungen hätte. Werden die Literale wirklich als (unkomprimiertes) UTF-16 innerhalb der Binärdatei gespeichert?

Ich hatte noch keine Zeit, die Unterschiede im Speicherplatzbedarf zu untersuchen.

EDITAR: Nicht direkt Unicode-bezogen, aber definitiv verwandt: Andreas Hausladen hat kürzlich einen interessanten Beitrag über die (erheblichen) Auswirkungen des {$STRINGCHECKS} Compiler-Option (übrigens: standardmäßig aktiviert) auf die Größe der kompilierten ausführbaren Datei: http://andy.jgknet.de/blog/?p=487

1 Stimmen

Nein, es komprimiert weder die Binärdateien noch seine Ressourcen. Hierfür müssen Sie einen externen Kompressor eines Drittanbieters verwenden, z. B. UPX. String-Literale, die im Code UnicodeString-Variablen zugewiesen werden, werden als UTF-16 gespeichert (und als UTF-8, wenn sie UTF8String-Variablen zugewiesen werden, Ansi, wenn sie AnsiString-Variablen zugewiesen werden, usw.).

-1voto

Ich habe zu viele Jahre auf eine Unicode VCL gewartet, endlich ist sie da. Ich glaube nicht, dass die meisten Anwendungen sich über die Größenprobleme Sorgen machen müssen, da sie ohnehin nicht so viele String-Literale haben oder große Datenmengen im Speicher speichern.

Fragen der Benutzerfreundlichkeit werden stärker gewichtet, um die Verwendung von Unicode so weit wie möglich zu rechtfertigen.

Wenn ein Entwickler eine winzige Exe erstellen möchte, kann er sie mit AnsiString von Hand optimieren (wenn i18n kein Thema ist).

-2voto

Neall Punkte 24968

Ich habe Delphi seit Jahren nicht mehr benutzt, aber es hängt wahrscheinlich davon ab, welche Unicode-Kodierung verwendet wird. UTF8 ist für den regulären ASCII-Zeichensatz genau dasselbe (es wird nur mehr als ein Byte verwendet, wenn man zu den exotischen Zeichen kommt). UTF16 könnte ein bisschen aufgebläht sein.

1 Stimmen

UTF-16 ist normalerweise kleiner für Sprachen, die nicht auf Latein basieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X