MSVC Heap Reserve / Commit - PullRequest
       12

MSVC Heap Reserve / Commit

2 голосов
/ 02 августа 2011

Я написал программу, которая требует ~ 1 ГБ ОЗУ при запуске, и это занимает больше времени, чем остальная часть программы в сочетании с холодным запуском.(это простая программа, последующие запуски занимают почти не время).При просмотре через диспетчер задач он запускается практически без ОЗУ, а затем увеличивается примерно на 2 МБ / с, пока не достигнет необходимого 1 ГБ.Я нашел параметры «Резервный размер кучи» и «Размер фиксации кучи» и установил их на 1000000000 каждый, но когда я наблюдал за программой через диспетчер задач, программа запускалась с 1 ГБ, а затем увеличивалась до 2 МБ / с, покаполучить bad_alloc.Обсуждаемая строка: std::vector<std::vector<char> > data(512, std::vector<byte>(2097252, 0));
Может ли кто-нибудь четко объяснить, для чего предназначены эти опции, и есть ли способ использовать их для ускорения моего распределения?Я прочитал http://msdn.microsoft.com/en-us/library/f90ybzkh(v=vs.80).aspx,, но это не объясняет поведение, которое я наблюдал.

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Распределение памяти не вызывает проблем со скоростью.Ваши проблемы со скоростью вызваны копированием ~ 2 МБ нулей 512 раз.Изменение этих свойств не поможет вам.

Я бы исследовал эффективные способы обнуления памяти, вместо того чтобы полагаться на std::vector, чтобы сделать это за вас.Или, по крайней мере, не передавайте std :: vector размером 2 МБ данных в качестве аргумента конструктору.Пусть конструктор по умолчанию создаст 512 пустых векторов, затем измените размер каждого из них до 2 МБ.По крайней мере, это не будет копия памяти;просто куча памяти пишет.

2 голосов
/ 16 августа 2011

Я понял, что это, вероятно, потому, что при первом запуске необходимо перенести содержимое памяти из ОЗУ на жесткий диск, тогда как при последующем запуске после первого запуска останется вся неиспользуемая память. Распределение / обнуление не имеет к этому никакого отношения. Извините всех.

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