экономия ресурсов
как выходит так, что порстая формочка занимает 10 мб. оперативки, а MS Word - только 12мб.?..как правильно распределять большую программу
оп нагрузкам (использовать dll?..)
склепал программу на с#.со врменем постоянно к нее чтото дописывал.теперь у меня программа, которая в оперативке занимает 30мб.
как выходит так, что порстая формочка занимает 10 мб. оперативки, а MS Word - только 12мб.?..как правильно распределять большую программу
оп нагрузкам (использовать dll?..)
Типичный вопрос...
Сам не пробовал, но:
http://www.gotdotnet.ru/DotNet/FAQ/CommonForum/Interop/524.aspx
В случае с .NET использовать надо именно динамическую подгрузку dll, а не статическую, тогда ты добьёшся малых размеров. Правда при работе с классами придётся рулить рефлексией (reflection) и описателями типов (TypeHandle). Ещё посоветую использовать интерфейс IDisposable или метод Finalize (для случая с VB) или GC.Collect для принудительной сборки мусора и удаления ненужного объекта.
GC.Collect к сожалению не "отпускает" память, занятую приложением, т.е. если приложение занимало 30Мб, то оно так занимать и будет.
Вообще-то, Майкрософт анонсировал возможность освобождения ресурсов после сборки мусора, но все-таки эта возможность не реализована :(
На .NET'е все приложения тяжелые и Hello World вроде как уже держит в памяти порядка 7Мб. Не знаю даже, насколько спасет рефлексия: надо делать опыты и сравнивать.
Рефлексия поможет от статической загрузки dll'ок. Другой способ состоит в избавлении от mscorlib.dll. Дизассемблируем в MSIL, затем из манифеста удаляем mscorlib.dll. Эта библиотека является библиотекой выполнения всех .NET-приложений (вроде C/C++ Runtime Library). По сути она является объединением таких библиотек, как System.dll, System.Drawing.dll и т.д.. Поэтому она включает в себя кучу классов, которые одновременно не используются в программе. Удаляем её из манифеста и добавляем только те библиотеки, которые нужны. Например, для HelloWorld хватит одной System.dll.
Надо будет попробовать с дизассемблированием, но по-моему дело не в библиотеках, т.к. JIT подгружает в память только используемые классы внешних сборок, а не сборки куском.
Типичный вопрос...
Сам не пробовал, но:
http://www.gotdotnet.ru/DotNet/FAQ/CommonForum/Interop/524.aspx
Я пишу свой wallpaper changer, программка небольшая, но отгребает в памяти блин порой по 40 метров. Описаный способ отлично помогает. Вот только приходится делать так, чтобы функция SetProcessWorkingSetSize(blabla) вызывалась каждую секунду...тогда прога больше метра не занимает места в памяти...
Но это ведь иррационально...Наверняка можно что-то еще сделать? Нет?
А то если вызывать эту функцию после определенных действий, а не постоянно, то размер проги в памяти сам растет непостежимым образом.
В общем хз чего делать...
class BlaBlaClass
{
...
~BlaBlaClass()
{
SetProcessWorkingSetSize(...);
}
}
Или так:
class BlaBlaClass: IDisposable
{
...
public void Dispose()
{
SetProcessWorkingSetSize(...);
}
~BlaBlaClass
{
Dispose();
}
}