История изменений
Исправление 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» — мне тоже не ясно.
В итоге, этот код отработает раза в три медленнее аналогичного алгоритма, сгенерированного компилятором Си с оптимизацией.
Я в споре с царем тоже пытался предоставить аргумент, мол, хаскель может генерировать быстрый асмовый код без работы с кучей, но в итоге вынужден был откатиться к аргументации «хаскель в какой-то там теории мог бы так делать, но в реальности не делает лишь малую часть, упорно отказываясь разворачивать циклы и совать промежуточные переменные в регистры, даже несмотря на то, что бэкэнд поддерживает эти оптимизации».