Frage

Ich bin die Speicherung einige Klassen mit WideString Parameter beschreiben (z.B. Namen, eine Beschreibung und einige andere).Jetzt wenn ich all diese WideStrings zu einfach "string" (I ' m using-alias eigentlich so, dass ich nur eine Zeile), die Speicherauslastung liegt bei etwa 5% größer!!als bisher...Wie ist das möglich, da jedes Zeichen der Zeichenfolge ist zweimal kleiner als die WideChar?

vielen Dank im Voraus!

m.

War es hilfreich?

Lösung

Der Delphi-Speichermanager entbindet nicht alle ungenutzten Speicher für das Betriebssystem. Fragmentierung kann auch sehr schlecht in Tritt. Beide hängen von dem tatsächlichen Speichermanager Sie verwenden (FastMM ist in der Regel besser als der Aktienspeichermanager in D7, aber jeder Speicher-Manager kann mit einer Memory-Manager spezifische Reihe von Speichernutzungsmustern zu ihm der Knien gebracht werden). Darüber hinaus Wide, obwohl sie sind COM-Strings, werden nicht gezählt Referenz, und auch später nicht freigegeben werden könnte als die normalen Saiten.

Die einzige zuverlässige Möglichkeit zur Abfrage tatsächlichen Speichers Nachricht in Delphi ist die Speicher-Manager Ihres Delphi-Programm verwendet zu fragen. Diese Funktion ist in der Unit System macht das für Sie:

function GetHeapStatus: THeapStatus

- jeroen

edit: 20100104 in Reaktion auf Kommentar von Marco: (FastMM ist in der Regel besser als der Aktienspeichermanager in D7, aber jeder Speicher-Manager kann mit einer Memory-Manager spezifische Reihe von Speichernutzungsmustern zu ihm der Knien gebracht werden)

Andere Tipps

Es ist möglich, weil die Saiten an Sicherheit grenzender Wahrscheinlichkeit einen (relativ) kleinen Teil der Programm verwendeten Speicher bilden auszuführen. Anderer Raum wird durch Griffe verwendet, verschiedene Objekte, etc.

Aus Gründen der Beispiel nehmen wir an, Sie über 100 KB Text haben, wenn ANSI-Zeichenfolgen verwenden und konvertieren es stattdessen zu Wide. Nur würden diese 100KB betroffen sein, aber diejenigen, 100KB nicht jedes einzelne Byte des Programms Speicherbedarf darstellen. Raum wird für Formulare, Griffe, Zahlen und andere Objekte verwendet wird, sondern weil sie nicht in der Umwandlung geändert werden, werden sie offensichtlich nicht benötigt mehr Speicher als vor der Umstellung.

WideStrings verwenden Sie einen anderen memory manager (windows ein), dann AnsiStrings (Delphi) und Referenz sind gezählt anders.Wie haben Sie Messen Sie die Speichernutzung?Mit welchem tool und was genaue Zähler?

Wie messen Sie Speicher verwendet? IIRC Widespeicher wird unter Verwendung von SysAllocString zugeordnet () und dadurch die Bypass-Delphi Speichermanager.

Speicherverwaltung in Delphi immer mehr Speicherplatz verbrauchen, als es wirklich braucht. Es ist eine solche Verbesserung der Geschwindigkeit.

Sind Sie mit Ansistring oder Typ Short, wenn nicht die Wide mit? Ist es möglich, dass Sie mit {$ H-} Compiler-Flag (entweder global oder in irgendeiner Einheit), die behandelt alle „String“ Typen wie Short kompilieren? Wenn Sie die Saiten von Short Typ sind und nicht angeben, die Stringgröße dann zugewiesen der Speicher immer 256 Byte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top