[personal profile] a7sharp9

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

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

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

x = x + x >> 1;

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

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

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

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

Date: 2005-03-15 07:07 pm (UTC)
From: [identity profile] kuzjavyj.livejournal.com
Иэх, красота какая.

Date: 2005-03-15 07:10 pm (UTC)
From: [identity profile] a7sharp9.livejournal.com
Скажи, да?

Это я ещё подозреваю, что у виртуальной машины какая-то защита есть от фрагментации, потому что из памяти не вылетает. Ведь даже если специально стараться, круче не раздробишь. Подметает она её, что ли, или как-то хитро освобождает и переиспользует.

Date: 2005-03-15 07:15 pm (UTC)
From: [identity profile] kuzjavyj.livejournal.com
подметальщик, наверное хорошо работает, быстро. И защита, да, иначе отчего бы она замедлялась.
Фрагментировать вам, не перефрагментировать.
Но красивая же ошибка!
а тут сидишь, и даже не хочется про ошибки рассказывать, потому - долго, нудно, и некрасиво.

Date: 2005-03-15 07:19 pm (UTC)
From: [identity profile] a7sharp9.livejournal.com
Замедляется-то из-за того, что всё большие и большие массивы по памяти гоняет. Там несколько миллионов элементов. Кстати, полный garbage collection не делает, обходится как-то частичным.

Очень красивая, угу. Я бы предпочёл нудно поскучать, чем её за хвост ловить. Две недели ловил. Она же на небольших задачах в профиле не вылезает, обязательно надо дать хорошенько раскрутиться.

Date: 2005-03-15 09:41 pm (UTC)
From: [identity profile] zhenyach.livejournal.com
При том, что с появлением первого Пентиума нужда в подобных извращениях отпала - что сдвиг, что деление делаются за один такт. Не говоря уже о том, что оптимизирующий компилятор и раньше догадывался, как правильнее делить на два.

Date: 2005-03-15 10:16 pm (UTC)
From: [identity profile] a7sharp9.livejournal.com
Видимо, фишка в том, что результат деления на 2 - число не обязательно целое, в отличие от сдвига. Это вопрос не хардвэрный, а виртуальной машины, как именно имплементировано деление с последующим присваиванием результата целой переменной.

Но ведь, независимо от этого - сдвиг круче, даже если он превращается в те же инструкции. Этот код не оптимизировался под скорость, это уж точно.

Date: 2005-03-16 05:38 am (UTC)
From: [identity profile] satangel.livejournal.com
это очень правильный подход

еще более интересно было бы написать х = х>>1 + x

хотя это какой-то неленивый СП - если б он поленился и написал как нужно было изначально:
х += х>>1
все бы работало, а исходник был бы на 2 байта меньше... :)

вот после таких деятелей, которые текст не комментируют а сопроводительную записку пишут на японском проекты и умирают....

Date: 2005-03-16 07:51 pm (UTC)
From: [identity profile] a7sharp9.livejournal.com
"Умер, шмумер..."

У нас такая ситуация была на прошлой моей работе. Был внутри системы модуль, написанный году в '87 на C (формально), но по делу, конечно, на Фортране, который занимался одной из основных задач, связанных с жуткой геометрией. Функции по пять страниц, переменные с именами i1 и a15, ну, как это обычно делается. И был один человек, который знал, что происходит. Потом он решил увольняться, и его усадили за написание - не то, чтобы документации, но хотя бы краткого руководства.

Которое он и представил. Несколько сот строчек очень схожего содержания: "если g2 вызывается из f3 и при этом в пятой строчке a7 равно нулю, а b1 при этом отрицательно - это плохо".

С тех пор никто не знает, что там внутри. К счастью, "лишь бы был здоров" - это именно то, что случилось, оно работает без внешнего вмешательства (или благодаря его отсутствию).

Date: 2005-03-16 11:52 pm (UTC)
From: [identity profile] satangel.livejournal.com
у меня примерно х00 000 строк такого кода без комментариев вообще
который сперва вообще не компилировался

я до сих пор не верю что он работает, если честно :)
руководитель тоже %)))))
Page generated Mar. 31st, 2026 06:40 pm
Powered by Dreamwidth Studios