C # 2k8 сократить использование памяти (простое приложение занимает 10 МБ) - PullRequest
2 голосов
/ 26 августа 2009

У меня есть простое приложение на C # 2008, которое отображает png-картинку и обрабатывает несколько простых MouseEvents.

Хотя в этом нет ничего сложного, оно использует как минимум 9,5-10 МБ памяти (как показано в диспетчере задач)

Я уже отключил любой тип регистрации ошибок, а также удалил символы отладки и трассировки.«Оптимизировать код» активирован.

Есть ли способ уменьшить это?Может быть, с некоторыми опциями, такими как встроенная компиляция фреймворка (существует ли она даже для .NET?)

Есть идеи?Или это просто цена, которую я должен заплатить за использование .NET-Framework?

Редактировать : 10 МБ это немного, я знаю.Но он будет работать на Citrix Presentation Server (или XenApp, как он сейчас называется), что означает, что на одном сервере находится ~ 30 пользователей.30 пользователей * 10 МБ = 300 МБ только для этого небольшого приложения.

Заранее спасибо и наилучшими пожеланиями

Ответы [ 3 ]

10 голосов
/ 26 августа 2009

Что бы вы ни делали, CLR должен быть загружен в процессе. 10 МБ - это не слишком много памяти, и не все из 10 МБ являются частной памятью (вероятно, большая ее часть является разделяемой). Между прочим, это не так, если «ваше простое приложение занимает 10 МБ, а его удвоение и сложность (с точки зрения памяти) потребуют вдвое больше памяти (в основном это объем памяти CLR.)

Я только что создал простое консольное приложение (for(;;);). «Монитор ресурсов» показывает, что он занимает ~ 2,5 МБ личной памяти и ~ 7 МБ разделяемой памяти.

0 голосов
/ 27 августа 2009

Проблема с .net в этом отношении заключается в том, что память управляется GarbageCollector, который будет принудительно собирать объекты, на которые нет ссылок, только тогда, когда у нее заканчивается место.

Вы также можете попробовать запустить сборку мусора вручную, см. Здесь: MSDN

Что вы можете сделать конкретно:

  • Старайтесь, чтобы ссылки на объекты были как можно короче
  • уменьшить количество используемых системных библиотек
  • взгляните на .NET Bootstrapping
  • взгляните на прекомпиляцию ваших сборок с помощью ngen.exe
  • используйте ассемблер :-) (шучу)
0 голосов
/ 26 августа 2009

Вы можете посмотреть что-то вроде статического связывания (http://www.codeproject.com/KB/cs/htmerge.aspx),, но я не уверен, как это повлияет на требования к памяти.

...