Быстрее ли выделить память статически один раз или выделить динамически?

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

В Element.h

// A vector to store a finite element residual vector in h file
static Real* sRe

В Элемент.С

if ( ! sIsResAndJacAllocated )
{
    UInt numElemDofs = this->GetNumDofs();
    // Residual storage
    sReXt         = new Real[numElemDofs*numElemDofs];
    sIsResAndJacAllocated = true;
}

Таким образом, вектор выделяется только один раз для первого элемента, который достигает этой функции, а остальные объекты просто многократно используют это пространство памяти.

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

Идея статического распределения этих векторов и массивов в группе состоит в том, что быстрее выделить эти большие фрагменты памяти только один раз и использовать их повторно; по сравнению с необходимостью выделять один и тот же массив несколько раз для каждого конечного элемента или каждый раз, когда вызывается функция (например, с помощью alloca). Это правда? Есть ли действительно большая разница в скорости?

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

Благодарю.

Hernan

1 ответ

Решение

Во-первых, при использовании слова "статически", это может сбить с толку разработчиков C++, полагая, что вы имеете в виду переменную со "статическим" объявлением. Ваш пример не объявляет массив статически; он создается в куче с помощью оператора "new". Я не знаю, насколько велики эти массивы, но создание хранилища один раз (статически, как вы это называете), вероятно, хорошая идея. Конечно, это зависит от того, сколько раз эти массивы пришлось бы создавать / уничтожать, если бы они выполнялись при каждом вызове функции (ваша альтернатива). Конечно, будет больше затрат на постоянное создание / уничтожение объектов в куче. Трудно сказать, является ли это проблемой производительности, поскольку мы не знаем, что еще делает ваша программа. Если он тратит 90% своего времени на другую обработку (файловый ввод-вывод, много вычислений и т. Д.), То, возможно, это распределение памяти не будет значительным фактором, так или иначе. Не зная ОС, опций компилятора и т. Д., Вы всегда можете написать код в обоих направлениях и запустить тест производительности.

Другие вопросы по тегам