2010-01-02 9 views
0

Je stocke des classes avec des paramètres WideString les décrivant (comme le nom, la description et d'autres). Maintenant, si je change tous ces WideStrings en simple "string" (j'utilise un alias en fait donc je dois changer une seule ligne), l'utilisation de la mémoire est environ 5% plus grande !! que précédemment ... Comment est-ce possible, puisque chaque caractère de la chaîne est deux fois plus petit que le WideChar?Problème d'utilisation de la mémoire Delphi, String vs Widetring, VCL non-unicode (D7)

merci d'avance!

m.

+0

Comment mesurez-vous votre utilisation de la mémoire? –

+0

Explorateur de processus de Windows Sysinternals, aussi gestionnaire de processus standard (ctrl alt del) – migajek

+0

Quel compteur? L'utilisation de Mem du gestionnaire de tâches est inutile dans ce cas. La taille de la VM est meilleure dans ce cas. –

Répondre

4

Le gestionnaire de mémoire Delphi ne libère pas toute la mémoire inutilisée dans le système d'exploitation. La fragmentation peut aussi très mal fonctionner. Les deux dépendent du gestionnaire de mémoire que vous utilisez (FastMM est généralement meilleur que le gestionnaire de mémoire de stock dans D7, mais n'importe quel gestionnaire de mémoire peut être mis à genoux en utilisant une série spécifique de mémoire du gestionnaire de mémoire). De plus, WideStrings, bien qu'il s'agisse de chaînes COM, ne sont pas comptés par référence et pourraient ne pas être publiés même plus tard que les chaînes normales. La seule manière fiable d'interroger le message mémoire réel dans Delphi est de demander au gestionnaire de mémoire que votre programme Delphi utilise. Cette fonction dans l'unité du système fait pour vous:

function GetHeapStatus: THeapStatus 

--jeroen

modifier: 20100104 en réaction à commenter par Marco: (FastMM est généralement mieux que le gestionnaire de mémoire disponible dans D7, mais n'importe quel gestionnaire de mémoire peut être mis à genoux en utilisant une série spécifique de modèles d'utilisation de la mémoire du gestionnaire de mémoire)

+1

Fragmentation de tas +1 ou utilisation de la mémoire par le syndrome procexplorer. FastMM n'est pas toujours mieux. En particulier si le code a été précédemment réglé, l'ancien peut être plus rapide. Alors que Fastmm est meilleur dans l'ensemble, la règle de benchmarking (mesure!) S'applique toujours. –

+0

Merci, j'ai édité la réponse à cause de votre commentaire. –

0

Il est possible que ces chaînes constituent une partie (relativement) faible de la mémoire utilisée pour exécuter votre programme. D'autres espaces sont utilisés par des poignées, divers objets, etc.

Par exemple, supposons que vous ayez environ 100 Ko de texte lorsque vous utilisez des chaînes ANSI et que vous les convertissiez à Widestrings. Seuls ces 100 Ko seraient affectés, mais ces 100 Ko ne constituent pas chaque octet de l'empreinte mémoire de votre programme. L'espace sera utilisé pour les formulaires, les poignées, les nombres et d'autres objets, mais comme ils ne sont pas modifiés lors de la conversion, ils ne nécessiteront évidemment pas plus de mémoire qu'avant la conversion.

+0

ok, mais la différence * seulement * entre la version unicode et non-unicode est la modification chaîne/chaîne large. *rien d'autre*. Les données sont générées à partir du même fichier et sont exactement les mêmes (comme prévu). Les données consistent en environ 3/4 des chaînes. Je l'ai vérifié sur un gros morceau de données, le résultat a pris 45 Mo supplémentaires en mémoire (43 en cas d'utilisation de WideString), et il est entièrement reproductible. – migajek

0

WideStrings utilise un gestionnaire de mémoire différent (un windows) puis AnsiStrings (Delphi) et sont référencés différemment. Comment avez-vous mesuré l'utilisation de la mémoire? Avec quel outil et quel compteur exact?

0

Comment mesurez-vous le mémo utilisé? La mémoire WideString IIRC est allouée à l'aide de SysAllocString() et contourne ainsi le gestionnaire de mémoire Delphi.

0

Le gestionnaire de mémoire dans Delphi prend toujours plus de mémoire, qu'il n'en a vraiment besoin. C'est une amélioration de la vitesse.

0

Utilisez-vous le type AnsiString ou ShortString lorsque vous n'utilisez pas WideString? Est-il possible que vous compiliez avec {$ H-} compilateur (globalement ou dans une certaine unité) qui traite tous les types "String" comme ShortString? Si vos chaînes sont de type ShortString et que vous ne spécifiez pas la taille de la chaîne, la mémoire allouée est toujours de 256 octets.

Questions connexes