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

топ 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, и не стоит их недооценивать.

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

Архив записей в блогах:
О взятии Иерусалима – и Грюнвальдской битве 15 июля случилось, как минимум, три события, о которых невозможно не упомянуть: в 1099 году крестоносцы взяли Иерусалим; в 1240-м князь Александр Ярославич побил шведов в устье Невы; наконец – в 1410-м польско-литовское войско сокрушило Те ...
Туннель под миром . Составители: Е. Брандис , В. Дмитревский, В. Кан. М.: Мир, 1965 г. Серия: Зарубежная фантастика . Срез англо-американской фантастики на начало 1960-х годов. Иллюстрация на обложке и титул Е. Бачурина . ...
Тут недавно в Сулакшин-центре состоялось некое собрание, где собрались все ривалюционеры и наметили план действий. Судя по всему, план был прост: сидеть на жопе, ждать, ничего не делать, ждать, пиздеть в инетиках, ждать. Ничем не отличается от моего Хитрого Плана Лекса. Правда, я слово ж ...
Жванецкий сказал, что писа́ть и пи́сать нужно только тогда, когда невмоготу. И вот настал этот сакральный час. Очень хочется смешных стихов. Есть знаменитая история про фразу Меня интересуют только мыши, их стоимость и где приобрести . Тогда в одном журнале засверкали целые россыпи поэ ...
Придумал,как нам победить на ЧМ по футболу! Путин женится на аргентинской президентше Кристине Киршнер,у нас будет уния,затем референдум,Аргентина присоединяется к России на правах Аргентинской области,Месси капитан сборной России!))) Так победим!) ...