32bit_me (32bit_me) wrote,
32bit_me
32bit_me

Category:

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

В одном из срачей дискуссий на хабре, о том, что лучше, С++ или 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, и не стоит их недооценивать.
Tags: C и C++, c, программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 22 comments