(no subject)
Mar. 15th, 2005 01:43 pmЧто делает Серьёзный Программист (далее - СП), когда ему нужно разделить целое число пополам? Конечно, использует оператор сдвига на один бит вправо.
Что делает тот же самый СП, когда ему нужно увеличить число в полтора раза? Выливает воду из чайника, смотри предыдущую задачу: берёт уполовиненное число и складывает его с собой.
Выглядит это так:
x = x + x >> 1;
К сожалению, эта строчка находится в куске кода, который решает, на сколько увеличить размер расширяемого массива при релокации.
К ещё большему сожалению, в этом куске кода (потому что П - С, и он учитывает краевые ситуации) имеется также обработка случая, когда x==1, состоящая в том, что если x не изменился, его следует увеличить на единицу.
Таким образом, поскольку приоритет у плюса больше, чем у сдвига (а на приоритеты операций СП никогда внимания не обращают), строчка не имеет никакого эффекта вообще (x умножили и тут же разделили на 2), срабатывает краевой случай, и массив переезжает в памяти с каждым новым элементом.
Программа вместо двух часов работает трое суток, замедляясь всё больше, и до конца так и не доходит.
Люди, умножайте на полтора.
no subject
Date: 2005-03-15 07:07 pm (UTC)no subject
Date: 2005-03-15 07:10 pm (UTC)Это я ещё подозреваю, что у виртуальной машины какая-то защита есть от фрагментации, потому что из памяти не вылетает. Ведь даже если специально стараться, круче не раздробишь. Подметает она её, что ли, или как-то хитро освобождает и переиспользует.
no subject
Date: 2005-03-15 07:15 pm (UTC)Фрагментировать вам, не перефрагментировать.
Но красивая же ошибка!
а тут сидишь, и даже не хочется про ошибки рассказывать, потому - долго, нудно, и некрасиво.
no subject
Date: 2005-03-15 07:19 pm (UTC)Очень красивая, угу. Я бы предпочёл нудно поскучать, чем её за хвост ловить. Две недели ловил. Она же на небольших задачах в профиле не вылезает, обязательно надо дать хорошенько раскрутиться.
no subject
Date: 2005-03-15 09:41 pm (UTC)no subject
Date: 2005-03-15 10:16 pm (UTC)Но ведь, независимо от этого - сдвиг круче, даже если он превращается в те же инструкции. Этот код не оптимизировался под скорость, это уж точно.
no subject
Date: 2005-03-16 05:38 am (UTC)еще более интересно было бы написать х = х>>1 + x
хотя это какой-то неленивый СП - если б он поленился и написал как нужно было изначально:
х += х>>1
все бы работало, а исходник был бы на 2 байта меньше... :)
вот после таких деятелей, которые текст не комментируют а сопроводительную записку пишут на японском проекты и умирают....
no subject
Date: 2005-03-16 07:51 pm (UTC)У нас такая ситуация была на прошлой моей работе. Был внутри системы модуль, написанный году в '87 на C (формально), но по делу, конечно, на Фортране, который занимался одной из основных задач, связанных с жуткой геометрией. Функции по пять страниц, переменные с именами i1 и a15, ну, как это обычно делается. И был один человек, который знал, что происходит. Потом он решил увольняться, и его усадили за написание - не то, чтобы документации, но хотя бы краткого руководства.
Которое он и представил. Несколько сот строчек очень схожего содержания: "если g2 вызывается из f3 и при этом в пятой строчке a7 равно нулю, а b1 при этом отрицательно - это плохо".
С тех пор никто не знает, что там внутри. К счастью, "лишь бы был здоров" - это именно то, что случилось, оно работает без внешнего вмешательства (или благодаря его отсутствию).
no subject
Date: 2005-03-16 11:52 pm (UTC)который сперва вообще не компилировался
я до сих пор не верю что он работает, если честно :)
руководитель тоже %)))))