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

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

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

Архив записей в блогах:
На правах недели рака в понятне. Случился тут такой случай. Попал на 704 на Комарин (за который нужно картоделам переебать с ноги, за последнюю неделю было 4 ничьих, одна на Эрленберге и три на Комарине), встал в козырный куст и стал ловить умников, форсирующих водную преграду. Не ...
Доставка грузов в Узбекистан является ключевым элементом активной торговли между Россией и Узбекистаном. Она требует оперативной, надежной и экономичной логистики. Современные компании-перевозчики предоставляют обширный спектр услуг для обеспечения бесперебойного транзита ...
Писатель и журналист Дмитрий Быков заявил в эфире «Эха Москвы», что причиной его госпитализации стало отравление. «Я точно совершенно знаю, что причина моего отравления — а это было отравление — она не установлена», — сказал Быков. Журналист отметил, что именно из-за отравления ему ...
И в продолжение размещенного накануне вечером поста о том, как в Румынии уже готовят для "аншлюса Молдавии" законодательную базу -- для ввода на ее территорию вооруженных сил румынских и НАТО: https://hippy-end.livejournal.com/6342307.html Еще два появившихся накануне сообщения из этой ...
Борис Джонсон очень точно охарактеризовал суть нашего нынешнего Величия.   https://www.youtube.com/watch?v=AYGRfwYdgFA Лавров и Джонсон несколько раз обменялись колкими шутками. Например... Лавров: Борис Джонсон недавно заявил, что у него нет доказательств, что Россия ...