Ускорение операций в bc
Как вы помните, я недавно устроил себе суточный хакатон, писал «Дум» на bc. Получился он тогда довольно медленным, особенно когда на экране было много объектов. Сейчас я его потихоньку оптимизирую, но так как профилирования в bc не существует, двигаюсь наугад.
По сути я до сих пор не знаю, на что там уходит больше всего времени, но иногда выбираю час-другой посмотреть какие операции ещё можно ускорить. Что, в целом, обычно, положительно сказывается на производительности.
В стандартной библиотеке bc есть много функций, написанных нативно. Их, как правило, удаётся так или иначе ускорить, поэтому я решил посмотреть что у меня из такого ещё используется. Взор пал на функцию band(), особенно в форме (band(a, b) && 1), то есть там, где всё, что меня интересует — установлен бит или нет. У меня в коде было несколько таких мест.
Написал свой вариант по мотивам того кода, который используется в стандартной библиотеке:
define check_bit(x, y) {
auto result, m[]
result = 0
scale = 0
while (x && y) {
x = divmod(x, 2, m[])
if (m[0]) {
y = divmod(y, 2, m[])
result += m[0]
} else {
y /= 2
}
}
return result
}
Получилось быстрее почти в два с половиной раза. Саму операцию band() тоже удалось ускорить в 1,7 раза, в «чистом» виде она у меня в коде тоже есть. Думаю, может сделать коммит в код bc?
Добавлено: коммит сделал. Но беда — автор bc в примечании к репозиторию на «Гитхабе» написал, что с «Гитхаба» он ушёл. К сожалению, то место, куда он ушёл не работает. Так что коммит пришлось залить на «Гитхаб», больше-то некуда.
Обязательно сделать, пропадет же.
И вообще цикл про bc надо бы собрать во что-тою.... хотя бы каталог ссылок на предыдущие серии
А там внизу тег есть же, bc.
Спасибо.