簡體   English   中英

如何提高 c++ 目標上的 antlr4 運行時性能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM