Плюсы и минусы использования SetProcessWorkingSetSize - PullRequest
11 голосов
/ 28 ноября 2011

У меня проблема с управлением памятью в моем приложении.Память приложения быстро растет во время выполнения.Я использую наборы данных в отключенном режиме.Чтобы преодолеть эту проблему, я часто сбрасываю DS, а также использую SetProcessWorkingSetSize для управления использованием памяти.Он отлично работает на моем компьютере для разработки.Каковы плюсы и минусы использования SetProcessWorkingSetSize?

Ответы [ 3 ]

15 голосов
/ 28 ноября 2011

SetProcessWorkingSetSize () контролирует количество ОЗУ , которое использует ваш процесс, в противном случае оно не влияет на размер виртуальной памяти вашего процесса.Windows уже достаточно хороша для динамического управления этим, заменяя страницы памяти по требованию, когда другому процессу требуется ОЗУ.Делая это вручную, вы сильно замедляете свою программу, вызывая множество сбоев страниц, когда Windows вынуждена менять страницы памяти обратно. SetProcessWorkingSetSize обычно используется для увеличения объема ОЗУ, выделенного дляпроцесс.Или форсировать обрезку, когда приложение знает, что оно будет простаивать долгое время.Также выполняется автоматически старыми версиями Windows, когда вы свернете главное окно приложения.

Нет необходимости вводить этот вывод, вы можете использовать свойства Process.GetCurrentProcess.Min / MaxWorkingSet.

4 голосов
/ 09 ноября 2013

Единственный хороший вариант использования, который я видел для этого вызова, - это когда вы ЗНАЕТЕ, что ваш процесс забирает много оперативной памяти системы, и вы хотите зарезервировать ее на время. Вы используете его, чтобы сказать ОС: «Да, я собираюсь съесть много системной оперативной памяти в течение всего цикла и не мешать мне».

В этой ситуации плохое поведение операционной системы по умолчанию. ОС выделяет по умолчанию количество МБ ОЗУ для каждого процесса - в основном, его рабочее пространство. Его эвристика управления ресурсами не является оракулом, поэтому, если они обнаружат, что какой-то процесс потребляет больше, чем его доля системных ресурсов (например, ОЗУ), они попытаются вернуть как можно больше излишков. Для ВАШЕГО процесса это означает, что ОС будет тратить много ресурсов ЦП (и, следовательно, ухудшать вашу производительность), перемещая память в адресное пространство и из него, когда в этом нет необходимости.

3 голосов
/ 16 июля 2017

Мы обнаружили, что для приложения с графическим интерфейсом, написанного на Delphi для Win32 / Win64 или написанного аналогичным образом, использующего большие и тяжелые библиотеки поверх Win32 API (GDI и т. Д.), Стоит вызвать SetProcessWorkingSetSize один раз,

Мы вызываем его с параметрами (... -1, -1) в течение доли секунды после того, как приложение полностью открылось и показало пользователю главное окно.В этом случае SetProcessWorkingSetSize (... -1, -1) освобождает большое количество кода запуска, который больше не нужен.Память быстро восстанавливается примерно до 1/3 того, что было бы без SetProcessWorkingSetSize (... -1, -1), и с тех пор не увеличивается (если приложение не выделяет больше памяти).Таким образом, мы эффективно сохранили 2/3 памяти в основном кода запуска (загрузка и анализ файлов конфигурации, инициализация графического интерфейса и т. Д.), Которые не понадобятся для продолжения работы приложения.

Если у вас есть графический интерфейсприложение, вы можете протестировать свое собственное приложение таким же образом - просто вызовите SetProcessWorkingSetSize один раз и посмотрите, сколько памяти определенно было освобождено.

Даже для серверного (сервисного) приложения, которое не имеет GUI - я думаю,что вызов SetProcessWorkingSetSize один раз после полной загрузки и инициализации сервера может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...