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

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

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

Архив записей в блогах:
Пройдёт ещё полвека, и в социальных сетях начнут появляться аккаунты, которые станут источником ценнейшей информации о человеке. Люди будут умирать, а страницы оставаться.  Станет модно писать в своём завещании пароли от страниц, оставляя ...
Сделаю подушку с портретом вашего котика. Для этого мне нужно несколько фотографий, а также сведения о характере зверя. Сначала я рисую эскиз (возможно, несколько эскизов) и обсуждаю его с вами, вношу при необходимости какие-то изменения. Приступаю к росписи подушки, когда эскиз ...
----------------------------------------------------------------------------------------------------------------------------------------------- " Совсем с ума сошли, совсем обалдели, как бы сказать попроще, по-народному: оборзели совсем ",    -    Владимир П утин о ...
В Америке много разных проблем. Им там живётся плохо. Про это каждому известно. И особенно плохо там с питанием. Питание там плохое, синтетическое, ненастоящее, калорийное, и вообще одна химия, и всякое там ГМО, и еда там вредная для здоровья, и непременно ведёт к одышке и к ожирению. ...
Прохожу тут как-то мимо зеркала и охуеваю!  Понимаю, что начинаю превращаться вот в это: Ну а хуле!? Пиво бочками, соответствующая закусь в виде свиных рёбрышек, копчёных ушек и всякой похожей фкуснейшей поеботины бггг А сегодня произошёл тот ...