Начальная точка для производительности 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 правила, где большую часть времени проводилось, и в этом случае этого было достаточно, чтобы увидеть, что нужно изменить (зная, где искать проблемы).