Изучаем телепортацию или приключение на 20 минут
Assasin, 2022-10-16 21:52:52
Джва года ждал, чтобы написать этот пост! (c)
Чат наконец-то научился корректно парсить блоки кода с вложенными в них цитатами, а не просто ломать экран Все благодаря новой библиотеке парсинга, у которой есть даже своя история.
Сначала я решил взять Parsinator для решения своих проблем с парсингом, но оказалось это было плохой идеей. Написанный на коленке бенчмарк показал, что новый алгоритм парсинга получился аж в ~1124 раза медленнее, чем старый на куче регулярок. Порывшись немного в его исходниках профайлером, выяснил, что оказывается, там на каждой генерации ошибок происходит полный перебор исходной строки для подсчета переносов строк. Просто временно подхачив это дело, код ускорился на порядки, и отставание от старого алгоритма стало уже ~227 раз.
Но куда это годится, верно? Даже распарсить 100 типично-тяжелых сообщений занимает ~1.8 секунд! Пишем собственную библиотеку для парсеров, стараемся делать минимум аллокаций, подмешиваем монады, немного оптимизаций и... вуаля, новый парсер всего в 4-5 раз медленее старого. С учетом того, что старый парсер полностью опирался по сути на нативный алгоритм регулярок, написанный на C++, а новый - больше чем на половину на мощь js и его JIT, - результат получился не самым плохим!
Спасибо, что дочитали до конца! Мира нам в это неспокойное время.
Чат наконец-то научился корректно парсить блоки кода с вложенными в них цитатами, а не просто ломать экран Все благодаря новой библиотеке парсинга, у которой есть даже своя история.
Сначала я решил взять Parsinator для решения своих проблем с парсингом, но оказалось это было плохой идеей. Написанный на коленке бенчмарк показал, что новый алгоритм парсинга получился аж в ~1124 раза медленнее, чем старый на куче регулярок. Порывшись немного в его исходниках профайлером, выяснил, что оказывается, там на каждой генерации ошибок происходит полный перебор исходной строки для подсчета переносов строк. Просто временно подхачив это дело, код ускорился на порядки, и отставание от старого алгоритма стало уже ~227 раз.
Но куда это годится, верно? Даже распарсить 100 типично-тяжелых сообщений занимает ~1.8 секунд! Пишем собственную библиотеку для парсеров, стараемся делать минимум аллокаций, подмешиваем монады, немного оптимизаций и... вуаля, новый парсер всего в 4-5 раз медленее старого. С учетом того, что старый парсер полностью опирался по сути на нативный алгоритм регулярок, написанный на C++, а новый - больше чем на половину на мощь js и его JIT, - результат получился не самым плохим!
Спасибо, что дочитали до конца! Мира нам в это неспокойное время.