Parse::RecDescent замедляется со временем
Я написал анализатор, который извлекает некоторые функции из файла конфигурации Cisco IOS (объекты, группы объектов, имена, интерфейсы, группы доступа, правила nat и, что наиболее важно, директивы списка доступа). Все это работает очень хорошо, но когда я запускаю его на большом конфигурационном файле (несколько тысяч строк), он становится все медленнее и медленнее, чем дальше в файл, который он идет. Фактически, время, необходимое для создания строки конфигурации данного типа, увеличивается пропорционально тому, сколько строк уже обработал анализатор.
Это все очень загадочно, так как я бы предположил, что каждая строка обрабатывается независимо от того, что было раньше. Ссылки (объекты, группы объектов и имена) используются при синтаксическом анализе списков доступа, но их определения предшествуют обработке любых списков доступа, поэтому время их поиска не изменяется.
После создания предварительно скомпилированной версии синтаксического анализатора я нахожу только одну переменную, которая продолжает расти в процессе синтаксического анализа одного файла: хеш с именем $thisparser->{linecounter_cache}
, но промывка, которая не меняет поведение замедления.
Есть ли какой-то аспект Parse::RecDescent
что может объяснить это постепенное замедление со временем?