Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

экономия ресурсов

10K
13 марта 2006 года
angor
10 / / 06.10.2005
склепал программу на с#.со врменем постоянно к нее чтото дописывал.теперь у меня программа, которая в оперативке занимает 30мб.
как выходит так, что порстая формочка занимает 10 мб. оперативки, а MS Word - только 12мб.?..как правильно распределять большую программу
оп нагрузкам (использовать dll?..)
713
13 марта 2006 года
Ap0k
360 / / 13.03.2006
Цитата:
Originally posted by angor
склепал программу на с#.со врменем постоянно к нее чтото дописывал.теперь у меня программа, которая в оперативке занимает 30мб.
как выходит так, что порстая формочка занимает 10 мб. оперативки, а MS Word - только 12мб.?..как правильно распределять большую программу
оп нагрузкам (использовать dll?..)


Типичный вопрос...
Сам не пробовал, но:
http://www.gotdotnet.ru/DotNet/FAQ/CommonForum/Interop/524.aspx

273
14 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
В случае с .NET использовать надо именно динамическую подгрузку dll, а не статическую, тогда ты добьёшся малых размеров. Правда при работе с классами придётся рулить рефлексией (reflection) и описателями типов (TypeHandle). Ещё посоветую использовать интерфейс IDisposable или метод Finalize (для случая с VB) или GC.Collect для принудительной сборки мусора и удаления ненужного объекта.
8.2K
14 марта 2006 года
Track
44 / / 30.05.2005
Цитата:
Originally posted by 3A3-968M
В случае с .NET использовать надо именно динамическую подгрузку dll, а не статическую, тогда ты добьёшся малых размеров. Правда при работе с классами придётся рулить рефлексией (reflection) и описателями типов (TypeHandle). Ещё посоветую использовать интерфейс IDisposable или метод Finalize (для случая с VB) или GC.Collect для принудительной сборки мусора и удаления ненужного объекта.



GC.Collect к сожалению не "отпускает" память, занятую приложением, т.е. если приложение занимало 30Мб, то оно так занимать и будет.
Вообще-то, Майкрософт анонсировал возможность освобождения ресурсов после сборки мусора, но все-таки эта возможность не реализована :(

На .NET'е все приложения тяжелые и Hello World вроде как уже держит в памяти порядка 7Мб. Не знаю даже, насколько спасет рефлексия: надо делать опыты и сравнивать.

273
15 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
Рефлексия поможет от статической загрузки dll'ок. Другой способ состоит в избавлении от mscorlib.dll. Дизассемблируем в MSIL, затем из манифеста удаляем mscorlib.dll. Эта библиотека является библиотекой выполнения всех .NET-приложений (вроде C/C++ Runtime Library). По сути она является объединением таких библиотек, как System.dll, System.Drawing.dll и т.д.. Поэтому она включает в себя кучу классов, которые одновременно не используются в программе. Удаляем её из манифеста и добавляем только те библиотеки, которые нужны. Например, для HelloWorld хватит одной System.dll.
8.2K
15 марта 2006 года
Track
44 / / 30.05.2005
Цитата:
Originally posted by 3A3-968M
Рефлексия поможет от статической загрузки dll'ок. Другой способ состоит в избавлении от mscorlib.dll. Дизассемблируем в MSIL, затем из манифеста удаляем mscorlib.dll. Эта библиотека является библиотекой выполнения всех .NET-приложений (вроде C/C++ Runtime Library). По сути она является объединением таких библиотек, как System.dll, System.Drawing.dll и т.д.. Поэтому она включает в себя кучу классов, которые одновременно не используются в программе. Удаляем её из манифеста и добавляем только те библиотеки, которые нужны. Например, для HelloWorld хватит одной System.dll.



Надо будет попробовать с дизассемблированием, но по-моему дело не в библиотеках, т.к. JIT подгружает в память только используемые классы внешних сборок, а не сборки куском.

2.0K
20 марта 2006 года
Androth
54 / / 07.03.2004
Цитата:
Originally posted by Ap0k
Типичный вопрос...
Сам не пробовал, но:
http://www.gotdotnet.ru/DotNet/FAQ/CommonForum/Interop/524.aspx



Я пишу свой wallpaper changer, программка небольшая, но отгребает в памяти блин порой по 40 метров. Описаный способ отлично помогает. Вот только приходится делать так, чтобы функция SetProcessWorkingSetSize(blabla) вызывалась каждую секунду...тогда прога больше метра не занимает места в памяти...
Но это ведь иррационально...Наверняка можно что-то еще сделать? Нет?
А то если вызывать эту функцию после определенных действий, а не постоянно, то размер проги в памяти сам растет непостежимым образом.
В общем хз чего делать...

273
21 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
Вызывай эту функцию в местах с наибольшим потреблением ресурсов - по окончании вызова функции, после очистки ресурсов особенно. Для этого в деструкторе (или Finalize для VB.NET) сделай вызов функции SetProcessWorkingSetSize. Например
class BlaBlaClass
{
...
~BlaBlaClass()
{
SetProcessWorkingSetSize(...);
}
}
Или так:
class BlaBlaClass: IDisposable
{
...
public void Dispose()
{
SetProcessWorkingSetSize(...);
}
~BlaBlaClass
{
Dispose();
}
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог