DY>на диске занимает чуть больше 20к, а в памяти чуть больше 500к.
DY>Слышал, конечно, что nt в целях ускорения работы выделяет заранее побольше DY>памяти, но как этим управлять?
А dll-ки она подгружает, а всякие там переменные окружения, стек, CRT-переменные.
Посмтотри здесь статью об уменьшении размера программ отказом от многого в
CRT: www.rsdn.ru/article/?cpp/crt.xml
но немного не про то.
Там все-таки рассказывается как уменьшить размер exeшника
Мне кажется дело в системе, а не в компиляторе.
для такой программы 500к на стек и переменные??
A Pwalk я в msdn'e нашел, а в VC(6) нет где он там?
Здравствуйте Zero, Вы писали:
Z>А dll-ки она подгружает, а всякие там переменные окружения, стек, CRT-переменные. Z>Посмтотри здесь статью об уменьшении размера программ отказом от многого в Z>CRT: www.rsdn.ru/article/?cpp/crt.xml
Здравствуйте DenisY, Вы писали:
DY>Почему (по крайней мере в Win2k) процессы жрут так много памяти, DY>и как её уменьшить?
Очень просто... Если в компьютере два дима, то вынимаешь один и... вуаля! Если один, то придется потрахаться в поиске другого. Если серьезно, то это оптимизация позволяющая работать приложениям быстрее. В конце концов занятая под процесс память — виртульная...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
VD>Очень просто... Если в компьютере два дима, то вынимаешь один и... вуаля! Если один, то придется потрахаться в поиске другого. Если серьезно, то это оптимизация позволяющая работать приложениям быстрее. В конце концов занятая под процесс память — виртульная...
Кстати, а что такое "занимаемая процессом память"? Используемая в данный момент оперативная? Вся виртуальная? Виртуальная с dll & exe? среднее арифмитическое? Я понимаю, что это словосочетание можно использовать в разных смыслах, интересно что показывает Task meneger.
Здравствуйте SergH, Вы писали:
SH>Здравствуйте VladD2, Вы писали:
VD>>Очень просто... Если в компьютере два дима, то вынимаешь один и... вуаля! Если один, то придется потрахаться в поиске другого. Если серьезно, то это оптимизация позволяющая работать приложениям быстрее. В конце концов занятая под процесс память — виртульная...
SH>Кстати, а что такое "занимаемая процессом память"? Используемая в данный момент оперативная? Вся виртуальная? Виртуальная с dll & exe? среднее арифмитическое? Я понимаю, что это словосочетание можно использовать в разных смыслах, интересно что показывает Task meneger.
Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.
Здравствуйте DenisY, Вы писали:
DY>но немного не про то. DY>Там все-таки рассказывается как уменьшить размер exeшника
Ну не только. Там сказано, как CRT отрубить от программы. А ещё есть у Мэтта Питрека статья в MSJ
1997 и 1998 Что-то типа Liposuction for PE... Там на ту же тему.
Отрудаешь CRT — Отрубаешь всякие её переменные, которые память кушают. А она по умолчанию
и кучу свою создаёт и операции с плавающей точкой инициализирует и много чего ещё.
Можете сами посмотреть в исходниках — файлы crt0*.cpp в каталоге CRT/SRC.
Это вообще полезно — исходники CRT читать.
DY>Мне кажется дело в системе, а не в компиляторе. DY>для такой программы 500к на стек и переменные?? DY>A Pwalk я в msdn'e нашел, а в VC(6) нет где он там?
Надо Pwalk вытащить из MSDN и скомпилировать в VC.
Ну стек, конечно, сначала не очень много места занимает, но всё же...
DY>на диске занимает чуть больше 20к, а в памяти чуть больше 500к.
DY>Слышал, конечно, что nt в целях ускорения работы выделяет заранее побольше DY>памяти, но как этим управлять?
Есть такая функция — SetProcessWorkingSetSize
Вот пример:
SetProcessWorkingSetSize(NULL, -1, -1); // уменьшает working set до 0
Количество используемой памяти действительно уменьшается.
Аналогичный эффект можно получить, задав линкеру (VC)опцию
/WS:AGGRESSIVE — в заголовке PE будет установлен нужный бит
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Вот пример: ВГ>SetProcessWorkingSetSize(NULL, -1, -1); // уменьшает working set до 0
ВГ>Количество используемой памяти действительно уменьшается. ВГ>Аналогичный эффект можно получить, задав линкеру (VC)опцию ВГ>/WS:AGGRESSIVE — в заголовке PE будет установлен нужный бит
Совет из разряда — "Если болит голова — Давайте её отрубим и болеть не будет."
Много где я читал, что ручное управление Working Set'ом до добра не доводит.
ОС сама лучше им управляет. Так что не там копаете. :no
Здравствуйте VladD2, Вы писали:
AF>>Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.
VD>Ты лучше как знаток скажи куда девается память (в его показателях) когда делаешь минимайз и рестор?
Это известный факт. Когда приложение минимизируется, его рабочее множество сбрасывается в ноль аналогично вызову SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1), вот и все. По мере того, как приложение "трогает" различные участки памяти, рабочее множество начинает расти опять.
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте VladD2, Вы писали:
AF>>>Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.
VD>>Ты лучше как знаток скажи куда девается память (в его показателях) когда делаешь минимайз и рестор?
AF>Это известный факт. Когда приложение минимизируется, его рабочее множество сбрасывается в ноль аналогично вызову SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1), вот и все. По мере того, как приложение "трогает" различные участки памяти, рабочее множество начинает расти опять.
Что факт известный я и сам знаю. Но вот с "рабочими множествами" — это все как-то мудрено. Ты бы лучше на пальцах показал.
PS
Чукча сидит на краю скалистого берега моря...
Всплывает Американская п.л.
— Куда ушла Русская лодка?
— Усла на зюй-зюй-вест.
— Секс...
Проходит время, всплывает Русская лодка
— Куда ушла Американская лодка?
— Усла на зюй-зюй-вест.
— Ты тут не зуйкай! Ты пальцем покажи!!!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Zero, Вы писали:
ВГ>>Вот пример: ВГ>>SetProcessWorkingSetSize(NULL, -1, -1); // уменьшает working set до 0
ВГ>>Количество используемой памяти действительно уменьшается. ВГ>>Аналогичный эффект можно получить, задав линкеру (VC)опцию ВГ>>/WS:AGGRESSIVE — в заголовке PE будет установлен нужный бит
Z>Совет из разряда — "Если болит голова — Давайте её отрубим и болеть не будет."
Я что, предлагаю процесс убить?
Z>Много где я читал, что ручное управление Working Set'ом до добра не доводит. Z>ОС сама лучше им управляет. Так что не там копаете. :no
И чем же так страшна функция SetProcessWorkingSetSize? Это один из ДОПУСТИМЫХ путей.
Или вся оптимизация должна сводится к борьбе с CRT?
Здравствуйте Владимир Гренадеров, Вы писали:
Z>>Много где я читал, что ручное управление Working Set'ом до добра не доводит. Z>>ОС сама лучше им управляет. Так что не там копаете. :no ВГ>И чем же так страшна функция SetProcessWorkingSetSize? Это один из ДОПУСТИМЫХ путей. ВГ>Или вся оптимизация должна сводится к борьбе с CRT?
В этом конкретном случае — да: "Reducing memory consumption is always a beneficial goal.
If you call SetProcessWorkingSetSize(0xffffffff, 0xffffffff), this tells the system that
your working set can be released. This does not change the current sizing of the working
set, it just allows the memory to be used by other applications. It is a good idea to do
this when your application goes into a wait state".
В случае реальной программы, только при указанных выше условиях. Стоит программе начать
работать, как ОС начнёт сама регулировать размер Working Set'a. А если CRT отрезать,
то памяти будет использоваться меньше независимо от того, работает программа или ждёт чего-то.
Здравствуйте Zero, Вы писали:
Z> В случае реальной программы, только при указанных выше условиях. Стоит программе начать Z>работать, как ОС начнёт сама регулировать размер Working Set'a. А если CRT отрезать, Z>то памяти будет использоваться меньше независимо от того, работает программа или ждёт чего-то.
Отрезание CRT большой погоды не сделает. Гораздо важнее правильно проектировать структуры данных, чтобы соблюдать locality of reference. Вот тут кое что есть на эту тему: