2016-02-04 7 views
3

В моем коде мне нужно управлять небольшими группами данных. Например, некоторые из моего кода могут выглядеть следующим образом:Для петли для небольших массивов?

bool flag0, flag1, flag2, flag3; 
int val0, val1, val2, val3; 

flag0 = GetFlag(0); 
flag1 = GetFlag(1); 

// Выполняет аналогичные вещи здесь.

Большую часть времени, я мог бы легко перейти к небольшой реализации массивов и обрабатывать их с помощью петель для подобных:

bool flag[4]; 
int val[4]; 

for(int i = 0; i < 4; i++) 
    flag[i] = GetFlag(i); 

...

Я знаю, что 2-й подход дает более читаемый код, чем 1-й, но для запроса.

Будет ли первый подход в целом работать лучше? Использует ли он меньше памяти или работает быстрее, не имея для накладных расходов цикла или накладных расходов массива?

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

Любая общая оценка двух? Как вы думаете?

Заранее благодарим за ответ.

+8

Stop делает микро оптимизации. Вы в конечном итоге тратите много времени без каких-либо значительных улучшений производительности. Помните правило 80-20. –

+6

Это мелочь. Не потейте. Используйте более читаемую и поддерживаемую версию, используя массивы и циклы. –

+4

Ваш компилятор может оптимизировать это намного лучше, чем вы сможете. –

ответ

8

Прежде всего micro-optimzation такие данные не имеют значения, пока вы не докажете, что они актуальны.

Что касается вашего конкретного вопроса, по крайней мере два возможных оптимизации компилятора приходит мне в голову:

  • Loop unrolling, который в основном переводит свой цикл в версию без петли на всех, и она могла бы быть легко применены к вашему случай
  • Automatic parallelization, которые могли бы быть в состоянии распараллелить цикл по множественному процессору, но вещи здесь становятся более сложными, так как компилятор должен быть в состоянии произвести несколько предположений

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

+1

Еще раз я недооцениваю силу компиляторов. Благодаря! –

1

То, что вы описываете, называется «разворот цикла». Компиляторы сделают это для вас автоматически в качестве части шага оптимизации кода, нет необходимости делать это вручную.

1

для кода C, такого как это, я не думаю, что это будет иметь значение, как вы его пишете. Компилятор GCC при использовании флага -O2 или -O3 для оптимизации будет делать это. Использование флага -O3 дает вам самый быстрый код. Поэтому я бы написал это с учетом человеческой читаемости. Еще одна вещь, которая может помочь, - не использовать одну переменную, чтобы делать все; иногда это может быть быстрее, если вы объявляете больше переменных, каждый из которых имеет конкретное использование в разделе или функции программы. Но опять же я считаю, что самое большое влияние имеет выбранный компилятор и флаг оптимизации.

https://gcc.gnu.org/onlinedocs/gcc/Option-Index.html

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

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