2008-12-23 17 views
10

Ich arbeite an einer kleinen Lesezeichenverwaltungsanwendung, die in C# geschrieben wurde und WPF verwendet. Es sitzt nur in der Taskleiste und ist 99% der Zeit im Leerlauf. Vor kurzem habe ich im Task-Manager nachgesehen und herausgefunden, dass es ungefähr 25 MB Speicher benötigt (und ungefähr 12 MB, bevor es zum ersten Mal aktiviert wird), was ich für eine App hielt, die die meiste Zeit nichts tut. Das brachte mich dazu, mich zu fragen, ob es Möglichkeiten gibt, die Speichernutzung zu reduzieren, indem beispielsweise WPF-Funktionen, die optional sind, deaktiviert werden.So reduzieren Sie die Speichernutzung einer WPF-App

Ich habe eine Tatsache entdeckt, die zu etwas führen könnte, obwohl ich keine Möglichkeit kenne, es zu nutzen. Threads in .NET benötigen jeweils etwa ein Megabyte, und es stellt sich heraus, dass meine App etwa 6/12 Threads verwendet (vor und nach der ersten Aktivierung). Dies ist für die Hälfte meiner Speicherbelegung verantwortlich, die ziemlich signifikant ist. Ich spreche keine neuen Threads direkt, aber ich habe keine Ahnung, wie WPF, sowie andere Teile von .NET, Threads für verschiedene Aufgaben verwendet, so dass ich es schwer finde, etwas dagegen zu tun. Wenn Sie Ereignisse für Dinge verwenden, die nicht direkt mit der GUI in Verbindung stehen, werden dadurch neue Threads erzeugt?

Also meine Frage ist zweifach, wie können Sie die Speichernutzung .NET/WPF-Anwendungen im Allgemeinen reduzieren und wie können Sie die Anzahl der Threads minimiert werden? Beachten Sie, dass ich nicht so sehr über kleine Details nachdenke, wie sie in this answer angesprochen wurden, sondern eher, wie Sie für eine geringe Speichernutzung in Ihrer gesamten Anwendung entwerfen.

Antwort

5

Leider sind ~ 25MB meiner Erfahrung nach die niedrigsten, die ich für kleine WPF-Apps gesehen habe, die ich gemacht habe, zumindest unter Windows XP. Ich denke, sogar die leeren WPF-Vorlagen benötigen ~ 20MB. Auf welchem ​​Betriebssystem laufen Sie?

Windows Vista ist eine bessere Geschichte, und Sie können wahrscheinlich erwarten, ~ 13-15 MB für eine leere Vorlage WPF App zu sehen.

Damit Ihre App 6-12 Threads verwendet und nur ~ 25MB verwendet, würde ich sagen, dass es Ihnen ziemlich gut geht. :-)

+1

Ich verwende Vista 64-Bit. Um ehrlich zu sein, ist es nicht wirklich etwas, worüber ich mir zu viele Sorgen mache. Ich meine, bei den aktuellen Hardware-Preisen ist der Speicher praktisch frei - es ist praktisch möglich, jede Kopie meines Programms mit einem 2-GB-Speicherstick zu bündeln;) –

+0

Sie werden sich darum kümmern, wenn Sie auf Terminal-Diensten, Server-Admin don Ich möchte 30 Leerlaufprozesse sehen, die ungefähr 1 GB RAM verschwenden. –

+0

Sie werden sich auch Sorgen machen, wenn viele andere ähnliche Anwendungen laufen, von denen jede viel RAM verwendet. Es ist wie die Straßen, bauen mehr Straßen und Sie am Ende mit mehr Stau, kaufen mehr RAM und Sie finden Ihre Box immer noch mehr benötigt. – gbjbaanb

5

Wenn es eine Taskleiste App ist, könnten Sie diesen Teil des Programms in WinForms (oder sogar C++) implementiert haben und nur die WPF-Anwendung spawnen, wenn der Benutzer auf Ihr Symbol doppelklickt. Auf diese Weise bezahlen Sie nur für das Gedächtnis, wenn Sie es tatsächlich verwenden.

1

Nicht sicher, ob dies hilft, aber in MS Visual C++ ist die Standard-Stack-Größe 1 MB und kann mit einer Compiler-Option eingestellt werden, was auch immer Sie wollen. Offensichtlich erbten C# -Apps diese Standardgröße (jeder Thread benötigt also mindestens 1 MB). Aber es scheint nicht zu sein, wenn ich "csc /?"

0

Es ist eine Tatsache von .NET/Java-Anwendungen, dass die CLR/JVM allocate a larger heap memory then actually needed/used. Sie sind in der Regel weniger bereit, OS zu veröffentlichen, es sei denn, dass OS physischen Speicher beansprucht.

Aber es ist wahr, dass memory-management is a difficult topic. Das Problem ist: Wie definieren Sie die memory usage von Ihrer Anwendung? Total reservierter virtueller Speicher? gesamter Arbeitssatz? privates Arbeitset? Speicher im Heap verwendet? Haufen zugeteilt? Minimum, Spitze oder Durchschnitt?

Eine Sache, die Sie tun können, ist mit CLR Profiler zu überprüfen, gibt es zu viel Heap zugeordnet. Sie können versuchen, es zu optimieren, indem Sie speicherintensive Takes verwenden, um zu verhindern, dass der Heap zu sehr glüht.

Verwandte Themen