Начальная точка для производительности ANTLR4

Я перенес довольно большую грамматику ANTLR2 в ANTLR4 и достиг шага, когда выходные данные в обеих грамматиках почти идентичны, за исключением нескольких крайних случаев. Однако некоторые файлы очень долго анализируются (даже в режиме прогнозирования SLL и BailOutStrategy), поэтому мне интересно, как мне найти, какие правила следует исправить в первую очередь.

Я уже собрал некоторую статистику с помощью Parser#setProfile(), но я не знаю, как интерпретировать результаты в каждом объекте DecisionInfo. Есть ли хорошая документация о том, как начать оптимизировать большую грамматику ANTLR4 и найти, какого кролика преследовать первым?

1 ответ

Поскольку я не знал, что искать в объекте DecisionInfo, вот что я нашел и помог мне улучшить время анализа, по крайней мере, на порядок.

Во-первых, я включил профилирование по грамматике с org.antlr.v4.runtime.Parser.setProfile(boolean profile), затем выполнил парсер с org.antlr.v4.runtime.Parser.getInterpreter().setPredictionMode(PredictionMode.SLL) на тысячах файлов и просматривал правила с самым высоким временем предсказания:

Arrays.stream(parser.getParseInfo().getDecisionInfo())
          .filter(decision -> decision.timeInPrediction > 100000000)
          .sorted((d1, d2) -> Long.compare(d2.timeInPrediction, d1.timeInPrediction))
          .forEach(decision -> System.out.println(
                String.format("Time: %d in %d calls - LL_Lookaheads: %d Max k: %d Ambiguities: %d Errors: %d Rule: %s",
                    decision.timeInPrediction / 1000000,
                    decision.invocations, decision.SLL_TotalLook,
                    decision.SLL_MaxLook, decision.ambiguities.size(), 
                    decision.errors.size(), Proparse.ruleNames[Proparse._ATN.getDecisionState(decision.decision).ruleIndex])))

и затем на максимальных махинациях, используя ту же самую лямбу, кроме:

filter(decision -> decision.SLL_MaxLook > 50).sorted((d1, d2) -> Long.compare(d2.SLL_MaxLook, d1.SLL_MaxLook))

Это дало мне 4 правила, где большую часть времени проводилось, и в этом случае этого было достаточно, чтобы увидеть, что нужно изменить (зная, где искать проблемы).

Другие вопросы по тегам