Оптимизация — Оптимизация часто вызываемой функции с большими локальными переменными (C ++)

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

void doSomething(){
int aReallyLargeVariable[10000];
...performing a few light operations on that variable and returning nothing...
}

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

0

Решение

Это не распределение, которое вызовет проблемы с производительностью. Проблема состоит в том, чтобы инициализировать его так, когда

    int aReallyLargeVariable[10000];

не займет много времени

    int aReallyLargeVariable[10000] = {0};

Сделаю. Также динамическое создание огромных объектов может вызвать проблемы.

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

Если вам нужно определить большое количество объектов, подумайте о другой структуре данных, такой как stack или же vector для этого не нужно иметь 1000 или более элементов

3

Другие решения

Чтобы оптимизировать эту функцию, учитывая, что она вызывается много раз, первый шаг должен быть do not declare the large variable locally, Когда вы делаете это, происходит несколько вещей:

  • много места в стеке тратится впустую, так как вы объявили массив локально и, вероятно, используете только несколько значений.
  • стековые операции (push / pop), вызванные этим объявлением, вероятно, перевешивают реальную работу, которую должна выполнить функция.

Вам лучше объявить этот массив где-то еще (объявить его глобально, если нужно) и передать указатель на массив. Таким образом, вы также можете повторно использовать память и не тратить время на перераспределение.

1

Я бы предложил выделить их как статические, чтобы весь int aReallyLargeVariable[10000];не будет беспокоить стек, выделяя и освобождая этот огромный объем памяти каждый раз, когда вызывается функция. Тем не менее, вы также можете объявить int aReallyLargeVariable[10000];
как глобальные, но многие разработчики ненавидят много глобальных переменных в своем коде. Если вам не нравятся статические переменные в функциях (из-за одновременного выполнения или около того) и вам также не нравятся глобальные переменные, тогда вы можете объявить переменную как статическую в глобальной области видимости, чтобы имя переменной было действительным только в контексте его объявления, которое может предотвратить ошибки компоновщика.

Source.cpp

static int aReallyLargeVariable[10000];
void myFunction()
{
aReallyLargeVariable[1] = 10;
}

Object.cpp

int aReallyLargeVariable[10000];  /* No name collisions during linking */

Примечание: это работает только до тех пор, пока вы не решите включить Source.cpp в Object.cpp или наоборот

0
По вопросам рекламы [email protected]