2013-07-10 2 views
-1

В C/C++ мне было интересно, что быстрее?Что происходит быстрее? (a + a vs 2 * a и более)

int a; 
int b = a + a; // this 
int b = 2 * a; // or this? 

Кроме того, важен тип данных? Как насчет long? как насчет количества раз мы складываем?

(насчет ...)

long a; 
long b = a + a + a +a; 
long b = 4 *a; 
+3

Попробуйте их и посмотрите. – Barmar

+1

Зависит больше от процессора, чем от языка. –

+0

Это легко попробовать с помощью секундомера. Почему бы вам не опубликовать то, что вы пробовали, если по-прежнему не знаете? –

ответ

9

Trust ваш оптимизирующий компилятор. Он знает, как оптимизировать для конкретного процессора/архитектуры так, как вы можете только угадать. Без ссылки на конкретную архитектуру нет смысла в таких выражениях, как «x быстрее, чем y?», Потому что все зависит от огромного числа факторов.

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

+1

Пример вопроса не заслуживает второй мысли, но есть вычисления, которые компилятор не может оптимизировать, потому что оптимизированная версия не является строго эквивалентной. Примеры включают замену 'x/2' на' x >> 1' (только программист может это сделать, если ey знает x≥0 или не заботится о различии при x≤0), 'x/5.0'' x * 0,2' и т. Д. Компилятор не может самостоятельно выбирать эти оптимизации. –

+1

@PascalCuoq Хорошая точка в целом, но плохие примеры (я бы предпочел оптимизацию на более высоком уровне, чтобы избежать впечатления о том, что такие проблемы на низком уровне стоит потратить время). Когда битбординг представляет интерес, вы должны использовать неподписанный тип, а затем 'x/2' и' x >> 1' эквивалентны. И хотя переписывание выражения с плавающей запятой является хорошим примером изменения результатов оптимизации, компиляторы * do * выполняют это, если его просят с эквивалентом '-ffast-math'. – delnan

+1

@ delnan Ну, мой любимый пример: '* p = 1; * q = 2; return * p + * q; 'но последующая дискуссия о передаче информации от программиста к компилятору не вписывается в комментарий SO. http://blog.frama-c.com/index.php?post/2012/07/25/On-the-redundancy-of-C99-sestrim PS: ** Я ** считаю, что '-ffast- math' - плохой встречный пример, потому что это похоже на предоставление компилятору лицензии испортить все вычисления с плавающей запятой, что не то же самое, что преднамеренно выбирать, что один конкретный расчет может быть выполнен как «x * 0,2» для его предполагаемого цель. –

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