2016-05-06 3 views
0

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

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

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

+1

Сделать переменную параметром функции и использовать одну и ту же переменную для многих вызовов функций? – rozina

+0

Является ли функция, называемая рекурсивно или одновременно? –

+1

И - поскольку вы уже знаете об альтернативных проектах, можете ли вы поделиться своими результатами тестов с результатами сравнений, которые вы наверняка уже выполнили? –

ответ

3

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

int aReallyLargeVariable[10000]; 

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

int aReallyLargeVariable[10000] = {0}; 

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

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

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

1

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

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

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

+0

Как говорит m.antkowicz, время, необходимое для самих операций стека (push/pop), не зависит от размера локальных переменных; эти операции просто изменяют значение регистра. –

Смежные вопросы