C# WinForms Размер приложения и потребление ОЗУ

222
25 марта 2018, 18:24

C# WinForms Размер приложения и потребление ОЗУ

Почему так происходит и как это исправить? При написании легкого приложения, где используются 3 формы всего и пару переменных, для счетчика (таймера типа), приложение весит ~30 КБ, а занимает ОЗУ начиная от ~13 МБ и доходит до ~24 МБ.

Аналогичное приложение с большим, даже очень большим функционалом для своего жанра приложение весит ~300 КБ, а занимает ОЗУ начиная от ~4 МБ и доходит до ~13 МБ. Написано это приложение тоже на C#.

Есть еще 1 приложение уже функционал меньше, меньше моего приложения, весит ~1 МБ, а занимает ОЗУ начиная от ~2 МБ и доходит до ~4 МБ. Приложение написано не на C#, а на чем-то другом, возможно Delphi или Lazarus.

Объясните почему так и как это исправить? Из-за чего так происходит и возможно на чем тогда писать (какой язык), чтобы было ООП (GUI, IDE).

Answer 1

CLR (Common Language Runtime) при старте выделяет с запасом пул памяти вашему приложению. Благодаря этому, память в дальнейшем выделяется очень быстро под ваши объекты.

Если очень хочется, можно отобрать у приложения лишнюю непотребляемую в данный момент память.

Для этого можно использовать WinAPI-функцию SetProcessWorkingSetSize

using System.Diagnostics;
using System.Runtime.InteropServices;

// Объявляем её
[DllImport("kernel32.dll")]
static extern bool SetProcessWorkingSetSize(IntPtr hProcess,
    int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

// Вызываем в том месте, где хотим уменьшить потребление памяти.
// Например, сразу после старта приложения.
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);

Естественно, когда программе понадобится больше памяти, она опять будет выделена.

Однако, это всё бессмысленные действия. Позвольте системе самой определять, сколько памяти нужно.

Дополню. Много памяти выделяется для того, чтобы приложение работало быстрее. При этом остальные приложения и система в целом не страдают: как только им станет не хватать памяти, ОС отнимет излишки у вашего приложения. А когда вы сами ограничиваете своё приложение в памяти, вы ухудшаете его производительность.

Это распространённый приём программирования: размен памяти на производительность.

Answer 2
  1. Приведенные вами цифры не являются существенными ни для современных систем, ни для систем 10-15 летней давности (для PC разумеется). Панику нужно поднимать когда потребление ресурсов постоянно и необоснованно растет - это явный признак проблем в коде. В противном случае все это преждевременные оптимизации.

  2. Размер файлов приложения на диске ни как не связан с используемой оперативной памятью. Причин для этого много: приложение может и использует ресурсы операционной системы, которые уже находятся в памяти; в процессе работы приложение может генерировать данные, на которые будет выделяться дополнительная память в процессе работы; дополнительный расход памяти может быть связан с особенностями конкретной среды исполнения вашего приложения.

  3. Любой удобный для человека язык добавляет накладные расходы на потребляемые ресурсы. Это неизбежная цена за комфорт как разработки, так и дальнейшего использования. Хотите минимизировать использование ресурсов вашим приложением - откажитесь от графических рюшечек, пишите на ассемблере с использованием максимально доступных оптимизаций компилятора. Может и получится круто, но затраты времени и необходимый уровень знаний выйдут на околоземную орбиту, а полезность для конечного пользователя будет все еще под большим вопросом. Когда выбираете на чем писать - выбирайте исходя из наличия и возможностей стандартных (или широко известных) библиотек и фреймворков, а также уровня ваших знаний, универсального правильного на 100% варианта не существует.

Ну и последнее. Оценивайте используемые ресурсы после компиляции в режиме Release и запуске без VisualStudio. В Debug-режиме не используются некоторые оптимизации компилятора и студия имеет привычку вмешиваться в процесс работы приложения для обеспечения возможностей отладки, поэтому приложение всегда потребляет больше, чем ему на самом делен нужно.

READ ALSO
Исключение типа System.IndexOutOfRangeException

Исключение типа System.IndexOutOfRangeException

Нужно считать массив из любого числа элементов, сами числа могут быть как целыми, так и с запятойПри запуске выходит исключение System

200
Выбор времени для выключения ПК C#

Выбор времени для выключения ПК C#

Делаю приложение на C#, которое будет выключать пк после выбора времени, через которое выключить, и нажатия на кнопкуЯ смог реализовать это...

176
Смена мест элементов массива

Смена мест элементов массива

Идея программы - замена порядка номеров в массиве на обратныйНо в итоге выдает [undefined, 1, 3, 4, 5]

233