2009-08-26 11 views
2

Ich habe eine einfache C# 2008-Anwendung, die ein PNG-Bild zeigt und einige einfache MouseEvents behandelt.C# 2k8 Speicherverbrauch reduzieren (einfache App dauert 10 MB)

Obwohl es nichts komplex ist, verwendet es mindestens 9,5 bis 10 MB Speicher (wie in task-Manager gezeigt)

Ich habe schon jede Art von Fehlerprotokollierung auch deaktiviert, wie ich debug entfernt und Spuren Symbole . "Code optimieren" ist aktiviert.

Gibt es eine Möglichkeit, dies zu reduzieren? Vielleicht mit einigen Optionen als natives Kompilieren des Frameworks (gibt es das überhaupt für .NET?)

Irgendwelche Idee? Oder ist das nur der Preis, den ich für das .NET-Framework bezahlen muss?

Bearbeiten: 10 MB ist nicht viel, ich weiß. Aber es wird auf einem Citrix Presentation Server (oder XenApp, wie es jetzt heißt) ausgeführt, was bedeutet, dass ~ 30 Benutzer auf einem Server sind. 30 Benutzer * 10 MB = 300 MB nur für diese kleine Anwendung.

Vielen Dank im Voraus und mit freundlichen Grüßen

+0

Gibt es einen besonderen Grund, warum dies ein Problem ist, * *? Oder ist es nur Neugier? – jalf

Antwort

10

Was auch immer Sie tun, wird die CLR haben in den Prozess geladen werden. 10MB ist nicht zu viel Speicher und nicht alle 10MB sind privater Speicher (wahrscheinlich ist das meiste davon gemeinsam nutzbar). Übrigens ist es nicht wie "Wenn Ihre einfache App 10 MB nimmt, macht es doppelt so komplex (Speicher-weise) benötigt den doppelten Speicher (im Grunde ist es der Speicherbedarf von CLR.)

Ich habe gerade eine einfache Konsole gebaut Anwendung (for(;;);). „Ressourcenmonitor“ zeigt es dauert ~ 2,5 MB private Speicher und ~ 7 MB gemeinsam nutzbare Speicher.

+7

10Mb ist nichts zu einem modernen System. Wenn Sie nicht gerade etwas wie ein Betriebssystem, ein Videospiel oder RDBMS erstellen, sind die Zeiten, in denen Sie Ihre App auf ein paar K beschränken müssen, vorbei. –

+0

@Joel: absolut. –

+0

Sie meinen, dass Videospielentwickler versuchen, den Speicherverbrauch zu reduzieren? Ich erinnere mich, dass ich vor ein paar Jahren geschockt war, als ein neues Spiel 512 MB RAM verwendete! –

0

Das Problem mit .net in diesem Zusammenhang ist, dass der Speicher von GarbageCollector verwaltet wird, die Sammlung von nicht referenzierten Objekten nur dann erzwingen, wenn es der Platz wird knapp.

Sie können auch versuchen, manuell eine Garbage Collection Triggern finden Sie hier: MSDN

Was können Sie besonders tun ist:

  • Versuchen Verweise auf Objekte so kurz wie möglich zu halten
  • die reduzieren Anzahl der verwendeten Systembibliotheken
  • Werfen Sie einen Blick auf .NET Bootstrapping
  • Werfen Sie einen Blick auf die Vorkompilierung Ihrer Assemblys über ngen.ex e
  • Verwendung Assembler :-) (Scherz)
Verwandte Themen