Об оптимизациях

топ 100 блогов 32bit_me19.01.2020 В одном из срачей дискуссий на хабре, о том, что лучше, С++ или Python, была вот такая функция, предназначенная для выбора минимального значения из двух:

min = x ^ ((y ^ x) & -(x > y));


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

min = (x < y)? x: y;


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

Ну а стандартные варианты std::min(x, y) и (оужас) std::min({x, y}) были объявлены некошерными заранее, особенно последний вариант, который, по мысли участника срача дискуссии, создаёт на стеке некий массив и совершает прочие непотребства, убивающие перфоманс на корню.

Однако, давайте проверим. В качестве тестовой выбирем архитектуру ARM32, оптимизация -O1, компилятор gcc 8.2.

Первый вариант:

min1:
        cmp     r1, r0
        movlt   r0, r1
        bx      lr


Второй вариант:

min2:
        cmp     r1, r0
        movlt   r0, r1
        bx      lr


Вариант с std::min(x, y):

min3(int, int):
        cmp     r1, r0
        movlt   r0, r1
        bx      lr


Вариант с std::min({x, y}):

min4(int, int):
        cmp     r1, r0
        movlt   r0, r1
        bx      lr


Вот так.

Если вы считаете, что ваш код будет оптимальным, потому что (вписать нужное), то, скорее всего, вы считаете неверно. Если вам нужно сэкономить время до такта, смотрите выход компилятора, не делайте предположений. Если нет, не пишите "оптимальный" вариант, пишите самый простой и очевидный, компилятор его соптимизирует (в большинстве случаев). И только если вы действительно видите на выходе компилятора какую-то дичь, следует разбираться, как это оптимизировать, но не раньше. Компиляторы несколько шагнули вперёд по сравнению с временами PDP-11, и не стоит их недооценивать.

Оставить комментарий

Архив записей в блогах:
Включил вчера "Вечернего Урганта", якобы развлекательную передачу - и что я там увидел? Правильно - рекламу выборов лично от Иван Андреича. И почему я не удивлен? Продолжаем ретро-рубрику "Навстречу Выборам!" Ибо, все, что я хотел сказать о выборах, я рассказал уже очень давно. Итак, ...
С каждым днем все больше убеждаешься в том, что с водой мы с вами - всеми секторами - выплеснули и ребенка. В том, что в советском хоккее было огромное количество вещей, от которых мы из-за своих комплексов совершенно напрасно отказались. Или нам ...
Один мой русский френд поздравил меня на прошлой неделе с первым днем еврейской Пасхи такими словами: «Поздравляю Вас с наступающим великим и древним Праздником - Песах! Одно из самых любимых мною мест в "Записках об А.А." Лидии Чуковской   - вот это:   "Когда я ...
2013 год. Виктория Нуланд раздаёт печенья и булочки на Евромайдане Из новостей: заместитель госсекретаря США Виктория Нуланд прибыла в Нигер и встретилась с начальником генштаба страны генералом Муссой Салау Барму. Она заявила, что военные Нигера при смене власти в стране действуют ...
Ученые из Швейцарии и США нашли участок человеческого мозга, отвечающий за честность. Его стимуляция увеличивает желание подчиняться моральным установкам. Писатель Эмиль Золя считал: ...