2013-08-11 4 views
0

Я разрабатываю приложение C++ с Qt; с огромным числом хрустов. Для всей операции требуется большое количество динамической памяти. Однако требование является переменной в зависимости от переменной, заданной пользователем.Выделение памяти заранее для приложения C++

В мониторе ресурсов я вижу, что память Commit памяти (память, выделяемая ОС для exe) продолжает расти со временем, так как моя программа создает массивы в динамической памяти. Поэтому, если я заранее позволю Windows знать, что мой exe будет использовать память X MB, это приведет к повышению производительности? Если да, то как это сделать?

+2

Рассматривали ли вы повторное использование некоторых выделенных массивов .. или, возможно, их повторное использование в качестве векторов –

+0

Действительно ли вы запускаете профилировщик в своем приложении, чтобы узнать, где он проводит время? –

ответ

2

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

Идея пула памяти заключается в том, что вы выделяете пул ресурсов, которые вам, вероятно, понадобятся при обработке существ (карты, векторы или любые объекты, которые вы часто встречаете с ,) и время, необходимое вам новый объект, вы берете первый доступный из пула, перезагружаете и используете его, а когда вы закончите с ним, вы кладете его обратно в пул, чтобы его можно было использовать позже.

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

+0

попробуйте использовать VerySleepy для распознавания таких проблем с производительностью. Он покажет вам очень быстро, если ваше приложение потратит много времени на новые операции и операции удаления. – NiRR

+0

@Lake, как вы уже упоминали, мои массивы создаются изначально в пуле, а затем используются как при необходимости. Меня беспокоил шаг, при котором массивы динамически распределяются новым оператором. Поскольку размер большой и несколько массивов требуются, я хотел знать способ сказать Windows, что я выделяю этот объем памяти X, так что ему не придется выделять каждый раз, когда я создаю новый массив. –

-1

Вы можете сделать большой выделение и удалить.

char *ptr = new char[50*1024*1024L]; 
delete[] *ptr; 

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

+1

Это, вероятно, не поможет, потому что Windows (как и другие современные ОС) делает «ленивое» выделение физической памяти. Это означает, что если вы выделите 50 МБ и не будете использовать его, ОС просто отметит 50 МБ виртуального пространства «в использовании», но фактически не назначит какую-либо физическую память для этого куска памяти. Когда память фактически используется (считывается или записывается), ОС в этот момент назначает ей физическую память. Это происходит из-за того, что OS предполагает, что программисты будут выделять большие буферы для различных целей, а затем не использовать все это ... –

+0

Новая система вызовов вызова/malloc вызывается для получения памяти. Единственное преимущество этого нового + удаления заключается в том, что после этого больше нет вызовов ОС для получения памяти, если только потребность в динамической памяти не превышает 50 МБ. У этого _does_ есть очень маленькая разница в производительности. – vrdhn

+0

МОЖЕТ иметь небольшой эффект, да.Но фактическое заполнение страниц все равно произойдет на более позднем этапе и, по крайней мере, в реализации glall-файла malloc, большие куски выделения вызовут mmap, и если весь блок, используемый mmap, затем освобождается, он немедленно возвращается обратно в ОС (и я ожидаю, что библиотека gnu std C++ также сделает это, вызвав основные функции malloc или реализуя подобную схему, но я не смотрел, как фактически выполняется «новый». Если вы знаете какие-то разные, дайте мне знать. –

1

Итак, если я заранее позволю Windows узнать, что мой exe будет использовать X МБ памяти, приведет ли это к повышению производительности? Если да, то как это сделать?

Я так не считаю. Память, на которой работает ваше приложение, является виртуальной, и на самом деле у вас нет хорошего контроля над тем, как Windows фактически распределяет/отображает физическую память на виртуальную.

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