[英]How to improve antlr4 runtime performance on c++ target?
我的工具意圖是計算從 antlr4 解析的結果。 輸入分為多行,例如:1+1、3*4、...每一行都會初始化解析器並調用訪問者。 因此,如果有 1000 行,就會調用 antlr4 解析器 1000 次。 它運行完美,除了設備上的性能稍慢。 即使快了 1 秒,我也希望能提高性能。
我使用 antlr4.7 作為運行時。 運行時目標在 c++ 上。
for (itFormulas = fMap - > begin(); itFormulas != fMap - > end(); itFormulas++)
{
auto initStart = std::chrono::high_resolution_clock::now();
ANTLRInputStream input(itFormulas - > second);
FormulaLexer lexer( & input);
CommonTokenStream tokens( & lexer);
FormulaParser parser( & tokens);
FormulaParser::MainContext * mainContext = parser.main();
auto initEnd = std::chrono::high_resolution_clock::now();
std::chrono::duration < double > totalInit = initEnd - initStart;
//calculate time
totalInitTime += totalInit.count();
auto visitStart = std::chrono::high_resolution_clock::now();
EvaluatorVisitor visitor(formulaMap, resultMap, inputMaps);
try {
antlrcpp::Any result = visitor.visit(mainContext - > children[0]);
auto visitEnd = std::chrono::high_resolution_clock::now();
std::chrono::duration < double > totalElapsed = visitEnd - visitStart;
//calculate time
totalVisitTime += totalElapsed.count();
resultMap - > insert(pair < string, double > (itFormulas - > first, v));
} catch (EvaluationException ex) {
string from = "Mistake" + string(" itFormulas->") + itFormulas - > first;
}
}
如果整個例程需要 5 秒,則解析器時間約為 1 秒,訪問者時間為 4 秒。
我希望時間可以更短,並希望知道可以優化哪個部分。
由於https://github.com/antlr/antlr4/pull/3318 ,運行時更新 4.9.3 應該會提高性能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.