[personal profile] a7sharp9

Что делает Серьёзный Программист (далее - СП), когда ему нужно разделить целое число пополам? Конечно, использует оператор сдвига на один бит вправо.

Что делает тот же самый СП, когда ему нужно увеличить число в полтора раза? Выливает воду из чайника, смотри предыдущую задачу: берёт уполовиненное число и складывает его с собой.

Выглядит это так:

x = x + x >> 1;

К сожалению, эта строчка находится в куске кода, который решает, на сколько увеличить размер расширяемого массива при релокации.
К ещё большему сожалению, в этом куске кода (потому что П - С, и он учитывает краевые ситуации) имеется также обработка случая, когда x==1, состоящая в том, что если x не изменился, его следует увеличить на единицу.

Таким образом, поскольку приоритет у плюса больше, чем у сдвига (а на приоритеты операций СП никогда внимания не обращают), строчка не имеет никакого эффекта вообще (x умножили и тут же разделили на 2), срабатывает краевой случай, и массив переезжает в памяти с каждым новым элементом.

Программа вместо двух часов работает трое суток, замедляясь всё больше, и до конца так и не доходит.

Люди, умножайте на полтора.

December 2018

S M T W T F S
      1
2345678
9101112131415
161718192021 22
23242526272829
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 31st, 2026 02:23 pm
Powered by Dreamwidth Studios