(no subject)
Mar. 15th, 2005 01:43 pmЧто делает Серьёзный Программист (далее - СП), когда ему нужно разделить целое число пополам? Конечно, использует оператор сдвига на один бит вправо.
Что делает тот же самый СП, когда ему нужно увеличить число в полтора раза? Выливает воду из чайника, смотри предыдущую задачу: берёт уполовиненное число и складывает его с собой.
Выглядит это так:
x = x + x >> 1;
К сожалению, эта строчка находится в куске кода, который решает, на сколько увеличить размер расширяемого массива при релокации.
К ещё большему сожалению, в этом куске кода (потому что П - С, и он учитывает краевые ситуации) имеется также обработка случая, когда x==1, состоящая в том, что если x не изменился, его следует увеличить на единицу.
Таким образом, поскольку приоритет у плюса больше, чем у сдвига (а на приоритеты операций СП никогда внимания не обращают), строчка не имеет никакого эффекта вообще (x умножили и тут же разделили на 2), срабатывает краевой случай, и массив переезжает в памяти с каждым новым элементом.
Программа вместо двух часов работает трое суток, замедляясь всё больше, и до конца так и не доходит.
Люди, умножайте на полтора.
no subject
Date: 2005-03-15 07:15 pm (UTC)Фрагментировать вам, не перефрагментировать.
Но красивая же ошибка!
а тут сидишь, и даже не хочется про ошибки рассказывать, потому - долго, нудно, и некрасиво.
no subject
Date: 2005-03-15 07:19 pm (UTC)Очень красивая, угу. Я бы предпочёл нудно поскучать, чем её за хвост ловить. Две недели ловил. Она же на небольших задачах в профиле не вылезает, обязательно надо дать хорошенько раскрутиться.