Быстрее ли выделить память статически один раз или выделить динамически?
Я аспирант в области машиностроения. У моей исследовательской группы есть собственный конечно-элементный код, написанный на 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% своего времени на другую обработку (файловый ввод-вывод, много вычислений и т. Д.), То, возможно, это распределение памяти не будет значительным фактором, так или иначе. Не зная ОС, опций компилятора и т. Д., Вы всегда можете написать код в обоих направлениях и запустить тест производительности.