LINUX.ORG.RU

История изменений

Исправление byko3y, (текущая версия) :

SBCL тоже умеет
(declare (optimize (speed 3) (safety 0) (debug 0)))

Опять отвратительный цикл, теперь сделанный самим компилятором:

>; 99: L1:   B902000000       MOV ECX, 2
>; 9E:       EB07             JMP L3
>; A0: L2:   48D1F9           SAR RCX, 1
>; A3:       480FAFC8         IMUL RCX, RAX
>; A7: L3:   840425F8FF1020   TEST AL, [#x2010FFF8]            ; safepoint
>; AE:       4883C002         ADD RAX, 2
>; B2:       488BD3           MOV RDX, RBX
>; B5:       4839D0           CMP RAX, RDX
>; B8:       7FD6             JNLE L0
>; BA:       EBE4             JMP L2

Я вообще не понимаю, какими критериями руководствовался компилятор, чтобы это сгенерить. Он итерирует через два и при этом делит результат на два. Почему нельзя было сгенерировать «CMP RAX, RDX» вместо двух команд «MOV RDX, RBX; CMP RAX, RDX» — мне тоже не ясно.

В итоге, этот код отработает раза в три медленнее аналогичного алгоритма, сгенерированного компилятором Си с оптимизацией.

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

Исходная версия byko3y, :

SBCL тоже умеет
(declare (optimize (speed 3) (safety 0) (debug 0)))

Опять отвратительный цикл, теперь сделанный самим компилятором:

>; 99: L1:   B902000000       MOV ECX, 2
>; 9E:       EB07             JMP L3
>; A0: L2:   48D1F9           SAR RCX, 1
>; A3:       480FAFC8         IMUL RCX, RAX
>; A7: L3:   840425F8FF1020   TEST AL, [#x2010FFF8]            ; safepoint
>; AE:       4883C002         ADD RAX, 2
>; B2:       488BD3           MOV RDX, RBX
>; B5:       4839D0           CMP RAX, RDX
>; B8:       7FD6             JNLE L0
>; BA:       EBE4             JMP L2

Я вообще не понимаю, какими критериями руководствовался компилятор, чтобы это сгенерить. Он итерирует через два и при этом делит результат на два. Почему нельзя было сгенерировать «CMP RAX, RDX» вместо двух команд «MOV RDX, RBX; CMP RAX, RDX» — мне тоже не ясно.

В итоге, этот код отработает раза в три медленнее аналогичного алгоритма, сгенерированного компилятором Си с оптимизацией.

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