[C#] Speicherbelegung minimieren

Gobble-G

Lieutenant
Registriert
Nov. 2002
Beiträge
727
Hallo zusammen,

ich habe ein kleines Windows-Form-Projekt im VS2005 erstellt, das eine Text-Datei aus dem Web lädt und einige Infos in einem Balloon-Tooltip anzeigt. Es macht also nichts Großartiges. Trotzdem belegt die Anwendung über 9MB im Speicher laut Taskmanager.
Wenn ich ein Windows-Anwendung-Projekt erstelle und ohne Änderungen kompiliere sind es auch schon 8MB.

Woran liegt dieser hohe Speicherverbrauch? Ist das C#? Kann man das nicht irgendwie minimieren? Gibt es da noch irgendwelche Schalter, die man beim Kompilieren setzen kann? Sollte ich die Programmiersprache wechseln, wenn ich ein kleines schlankes Tool programmieren möchte?

Danke und schönen Abend,
Gobble-G
 
Das ist denke ich der Overhead des .NET Framework. 9MB sind da noch relativ wenig. Normal kannst du mit ca. 20MB pro exe rechnen, aber ist der Rest dann relativ sparsam, was den Platz angeht und ich glaube, wenn die ganzen Bibliotheken in unmanaged C++ einbinden müsstest, dann wärst du auch mindestens dort.
Die Frage ist, warum willst du den RAM-Verbrauch optimieren. Wenn es keine Hintergrundanwendung ist, die immer läuft (so etwas sollte man sowieso auf absolute Minimum reduzieren), dann ist das doch egal. Ich gehe immer davon aus, dass ca. 50-100 MB für meine Anwendung zur Verfügung stehen und optimiere darauf die Performance, indem ich das einfach als Cache nütze. Dadurch ist es auf aktuellen PCs deutlich schneller und wer eine uralte Kiste mit <512MB RAM hat, der darf sich eh nicht wundern, wenn alles langsam geht, wenn er nebenbei noch 10 andere Sachen offen hat.
 
Wenn du wirklich ein kleines schlankes Tool willst, solltest du die Programmiersprache wechseln, ja... aber ob es sich wirklich lohnt?
 
Also das Tool soll schon ständig laufen, deswegen stören mich die 9MB auch ein bisschen. Mehr als das NotifyIcon, Kontextmenü und der Balloon-Tooltip ist von der Anwendung nicht zu sehen. Das ganze beschränkt sich auf wenige Code-Zeilen, die nur kleine Strings behandeln und deshalb finde ich 9MB auch vergleichsweise viel. (Skype mit 11MB und QIP mit 8MB können da wirklich sehr viel mehr und da finde ich den Speicherbedarf angemessen.)

@andr_gin: Aus was setzt sich dieser .NET-Overhead zusammen? Was meinst du mit "als Cache nutzen"?
(Und ja, hier gibt es noch 2 Rechner mit nur 512MB RAM.)

Könnte man das eigentliche Form irgendwie entfernen, so dass das NotifyIcon drinbleibt? Würde das was bringen? (Ich nutze den Designer vom VS.)
 
Überleg dir ob du es nicht besser in VC++ oder Delphi schreibst...

Mit .net-Overhead meint er, dass die .net Runtime selbst nun mal einiges an Speicher braucht...
 
Bei so einem kleinen Programm kannst du wirklich eine schlanke(ere) Spache nehmen: VB,VC++,Delphi
 
also erstmal solltest du dir über die Speicherverwaltung in .NET im Klaren sein. Insbesondere über den Begriff "Garbage Collector".

Das ist vom MS hier und hier beschrieben. Und Weiterführendes hier.

Mit der Klasse im Anhang kannst du dann was anfangen, Hier wird der Speicherverbrauch deiner Anwendung "forced" auf ein Minimum reduziert.

Das ist allerdings mit Vorsicht zu genießen.
 

Anhänge

@jcdenton2: Hey danke für die Links und den Code. Ich habe heute mal Zeit gefunden, mich in den Garbage Collector einzulesen. Alles habe ich auf Anhieb nicht durchblickt, aber das ist schon ein interessantes Thema. Der Code aus deinem Anhang funktioniert soweit auch. Damit belegt die Anwendung im "Standby" nur noch 1,5MB. Sobald wieder etwas ausgelöst wird, steigt der "Verbrauch" wieder.

So wie ich es verstanden habe, läuft der Garbage Collector (standardmäßig) erst, wenn der managed Heap voll ist und keine neuen Objekte mehr ohne die "Einsammlung" angelegt werden können. Dabei stellt sich mir die Frage, wie zuverlässig die Anzeige der Speicherauslastung bei .NET-Anwendungen im Taskmanager bzgl. der Aussage zum verfügbaren Speicher (z.B. für eine neu zu startende Anwendung) ist. Wenn der nicht mehr benötigte Speicher erst bei Bedarf geräumt wird, hat die Speicherauslastungsanzeige doch eh keinen Wert, oder?

Noch ein paar andere Fragen:
Wie sieht das mit Visual C++ aus - gibt es dort auch den Garbage Collector, da das .NET-Framework verwendet wird oder wie muss man sich das vorstellen? Was hat es mit MFC aufsich? Läuft das separat zum .NET-Framework oder ist das dort (inzwischen) integriert?


Gruß, Gobble-G
 
Visual C++ ist der Teil vom Visual Studio von Microsoft, der für C++ "zuständig" ist.
Die meisten Leute meinen damit aber "C++ Programmieren mit Nutzung von Microsoft Bibliotheken".

In C++ gibt es keinen Garbage Collector. Wenn du Speicher anforderst mit new musst du den Speicher später selbst mit delete wieder freigeben.
(Es gibt GCs für C und C++, aber eben nicht im Standard)

MFC ist eine objektorientierte C++ Klassenbibliothek von MS zur Erstellung von grafischen Oberflächen.
Es ist keine Laufzeitumgebung sie Java und .NET bieten. Also "läuft" MFC nicht "nebenher".
 
Hm, aber ich dachte immer, dass man im Visual C++ auch das .NET nutzen könnte. Ist das nicht so?

Mir ist auch nicht klar, was nun die wirklichen Unterschiede zwischen
  • Win32-Anwendung
  • MFC-Anwendung
  • Windows Forms-Anwendung
ist. Hat da jedes seine eigenen Bibliotheken? Was sind die Vorzüge der jeweiligen Projekte? Was eignet sich wofür?

Weiß da jemand bescheid?

Danke und Gruß,
Gobble-G
 

Anhänge

  • Zwischenablage-1.jpg
    Zwischenablage-1.jpg
    82,5 KB · Aufrufe: 272
Das sind doch nur Projektvorlagen.
Ein Win32 Projekt ist so konfiguriert, dass es (zusätzlich zur C++ Standardbibliothek) noch die Win32 Bibliothek einbindet (bei einem MFC oder Windows Forms Projekt wird halt noch die MFC, bzw. Windows Forms, eingebunden).
Wenn du nun versuchst in einem Win32 Projekt MFC Klassen zu nutzen, dann wird spätestens der Linker meckern, weil in den Linkereinstellungen nicht steht, dass er auch gegen die MFC linken soll.

Und nochmals:
Visual Studio ist die komplette Entwicklungsumgebung. Visual C++ ist der Programmteil, der für C++ zuständig ist. C++ ist die Sprache, die in diesem Programm programmiert wird.
Zum Vergleich: MS Office ist das komplette Paket. Word ist darin für Texte zuständig. Allerdings hast du die Freiheit die Sprache der Texte die du schreibst selbst zu bestimmen (deutsch, englisch, italienisch oder was auch immer).

Welche Art von Projekt du startest, hängt davon ab was du machen und nutzen willst.
Willst du Programm mit grafischer Oberfläche schreiben, bietet sich MFC oder Windows Forms an. Je nachdem mit welcher Bibliothek du besser zurecht kommst, oder was du sympatischer findest.
 
OK, jetzt wird es klarer. Eine Frage nochmal: ist es denn nun möglich in C++ das .NET-Framework bzw. dessen Klassenbibliotheken zu nutzen?
 
Zurück
Oben