После профилирования среды выполнения antlr4 C ++ я заменил вызовы "is ", которые используют динамическое приведение, чтобы проверить тип класса в наиболее заметных местах, методом старой школы isType, которая использует битовую маскировку для каждого класса, оченьКак и в случае с техникой, во время выполнения я набрал около 20% регресса.
Следующим нарушителем во время выполнения в очереди является:
ParserATNSimulator.cpp
auto onExit = finally([this, input, index, m] {
mergeCache.clear(); // wack cache after each prediction
Вызов:
void PredictionContextMergeCache::clear() { _data.clear(); }
, который вызывает очистку unordered_map, которая, в свою очередь, вызывает дорогой memset к 0. Интересно, нет ли здесь более быстрой реализации, возможной.
Спасибо Alain