Способы заставить вашу программу использовать меньше памяти

Программное обеспечение будет использовать память, неудивительно, но как свести это использование к минимуму по сравнению с размером вашей программы.

Думаю, лучшим примером будет Firefox. Некоторые пользователи испытали это, другие нет, но можно с уверенностью сказать, что все предыдущие версии Firefox использовали гораздо больше памяти, чем текущая версия. Тем не менее, функциональность расширяется и добавляются опции. Я бы ожидал, что использование памяти увеличится в качестве дополнительных опций, и такие вещи будут добавлены.

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

Итак, я превращаю это в вопрос о «лучших практиках», спрашивая всех вас, какие у вас маленькие уловки и хитрости, чтобы заставить вашу программу делать то, что она делает, с меньшим объемом ЦП, чем вы обычно думаете. А также то, чего, безусловно, следует избегать.

Небольшой побочный вопрос: я наткнулся на кое-что в книге о C#. По-видимому, при кодировании Enum можно установить размер индекса этого Enum. Я думаю, что с большими Enum вы должны позволить компилятору обработать это, но для Enum, который содержит только 2 или 3 элемента, вы можете сделать это:

public enum HTMLTYPE : sbyte
{
    HTML401,XHTML10,XHTML11
}

Для тех из вас, кто не знает почему, очевидно, объем памяти, зарезервированный для индекса любого Enum, автоматически устанавливается на целое число в C#. Другими словами, этот объем памяти будет зарезервирован. Но когда вы определяете такие мелочи в вашем Enum, целое число - это пустая трата места. В книге утверждалось, что это может сократить объем памяти, используемой программой. Мне интересно, правда ли это.

РЕДАКТИРОВАТЬ: действительно, это должна быть память, черт возьми. Поменял все записи.

Ответов (7)

Решение

Об этом есть хорошая онлайн-книга:

http://www.cix.co.uk/~smallmemory/

Это правда, и это неправда. Существует причина использования int - процессор использует его естественным образом (кроме случаев, когда работает x64 Windows, более естественным будет Int64). Это связано с тем, что в процессоре у вас есть 4 регистра длиной 32 бита (или 64 бита в режиме x64).

Кроме того, давайте посмотрим правде в глаза: .NET - это не только эффективность, как в памяти, так и в процессоре. Существуют практики, позволяющие не допускать больших ошибок (например, конкатенация строк в цикле вместо использования StringBuilder), но сокращение перечислений с 4 до 1 байта того не стоит.

Во-первых, вы, вероятно, путаете ЦП и ОЗУ (или память). ЦП - это процессор, то есть то, что выполняет ваш код с вашими данными. Память - это место, где хранятся этот код и данные .

Этого трюка с enum действительно следует избегать. Во-первых, sbyte это несовместимо с CLS. Тогда это может ограничить будущее расширение. Всегда есть факт, что процессор всегда использует целые слова ( int в 32-битных архитектурах и long в 64-битных архитектурах). Вы все это теряете, и ради чего? Несколько байтов от вашей памяти.

Если говорить более конкретно, следуйте этим мудрым словам: Преждевременная оптимизация - корень всех зол.

Это означает, что оптимизируйте только тогда, когда это действительно необходимо. Сначала измерьте вещи. Вы, скорее всего, поймете, что это не те три байта из перечисления, которые нужно сокращать.

Один из способов - использовать отложенную инициализацию для создания объектов только тогда, когда они вам нужны.

Кроме того, не забудьте удалить (или установить значение NULL) объекты, которые вам больше не нужны, чтобы их можно было собрать сборщиком мусора.

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

Затем создайте новую версию кода, адаптированную для памяти. Таким образом, вы можете быть уверены, что будущие выпуски не будут работать с обфусцированным кодом.

И да, с лучшей памятью и меньшим количеством процессоров вы будете думать о такой оптимизации.

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

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

Однако отказ от ответственности: оптимизация использования памяти не всегда может быть хорошей идеей. К сожалению, большую часть времени вам приходится принимать решения о том, следует ли оптимизировать по времени (использование ЦП) или по пространству (ОЗУ или дисковое пространство). Хотя иногда вы можете съесть пирог и съесть его, но это не всегда так просто.

Небольшой побочный вопрос: я наткнулся на кое-что в книге о C#. По-видимому, при кодировании Enum можно установить размер индекса этого Enum. Я думаю, что с большими Enum вы должны позволить компилятору обрабатывать это, но для Enum, который содержит только 2 или 3 элемента, вы можете сделать это:

...

Для тех из вас, кто не знает почему, очевидно, объем памяти, зарезервированный для индекса любого Enum, автоматически устанавливается на целое число в C#. Другими словами, этот объем памяти будет зарезервирован. Но когда вы определяете такие мелочи в вашем Enum, целое число - это пустая трата места. В книге утверждалось, что это может сократить объем памяти, используемой программой. Мне интересно, правда ли это.

Я не уверен на 100% в этом, но это не обязательно может быть правдой. На самом деле, это , вероятно , не верно , если вы используете Mono и развертывание этого приложения на других системах. Причина в том, что разные операционные системы и процессоры имеют разные требования к выравниванию памяти. Таким образом, даже если вы объявляете его как sbyte, он может быть преобразован в 32-битное или 64-битное целое число к тому моменту, когда он все равно попадет в память (OS X особенно требовательна к выравниванию памяти).

Я мог полностью упустить суть здесь, и в данном случае книга могла быть совершенно правильной. Но я хочу сказать, что «это немного сложнее, чем это», и указать, что такие оптимизации могут не переноситься на другие платформы (другие ОС, процессоры и языки программирования).