[英]How to profile an Antlr grammar
我有一個Antlr語法,目前大約有1200行。 它解析我想要的語言,但是對於至少一種構造而言,即使對於較小的輸入文件,它的速度也令人望而卻步。 對於構造的每個添加元素,執行時間似乎都呈指數增長。
我想知道是否有任何良好的准則來調試/分析此類性能問題。
我已經嘗試過使用VisualVM,並且將這兩個方法的名稱命名為closureCheckingStopState和closure_,但這與找出語法錯誤的方式相距不遠。
JetBrains IDEA插件中有一個Profiler選項
參見: https : //github.com/antlr/intellij-plugin-v4/blob/master/README.md
右鍵單擊任何規則以測試規則,您將獲得用於
請參閱下面的示例屏幕截圖。
探查器選項卡中的歧義線有助於查找模糊的解析規則。 如果單擊這樣的紅線,則規則將突出顯示。
我依靠兩個主要項目來分析和提高語法的性能。
ANTLRWorks 2的最新版本包括高級配置功能。 當前的限制包括以下內容:
CharStream
或TokenStream
語言(例如,用於預處理輸入)。 -> skip
或-> channel(HIDDEN)
不會造成問題。 我使用的是主要版本的分支,其中包括ANTLR 4的參考版本中未提供的許多優化。請注意,這些功能“很少”記錄在案,因為它們迄今為止的唯一目的是支持ANTLRWorks和GoWorks的內部開發。 。 對於大多數語法,此fork的執行效果大致等同於參考版本。 但是,對於某些已知的語法,“優化”版本的執行速度是參考版本的200倍以上。
如果您可以提供語法和特別的輸入,那么我可以運行分析並嘗試解釋結果的關鍵部分。
ANTLRWorks的最新版本通過官方NetBeans更新中心發布。 只需運行“ 工具”→“插件” ,轉到“ 可用插件”並找到ANTLRWorks編輯器 。
要運行分析器,請使用運行→解釋解析器...命令。 通過選擇“ 窗口”→“解析器調試器控制器”,可以在解析操作后使用結果窗口。
正如Wolfgang Fahl
所說,IDEA有一個很棒的插件,但是它當然只顯示解析器收集的信息。
因此,如果您無法使用IDEA,或者例如想要實時進行性能分析,則可以通過編程方式進行,如下所示:
public void parseAndProfile(GmmlSaneParser parser) {
parser.setProfile(true);
// do the actual parsing
ParseInfo parseInfo = parser.getParseInfo();
ATN atn = parser.getATN();
for (DecisionInfo di : parseInfo.getDecisionInfo()) {
DecisionState ds = atn.decisionToState.get(di.decision);
String ruleName = GmmlParser.ruleNames[ds.ruleIndex];
System.out.println(ruleName +" -> " + di.toString());
}
}
如果您已經擁有Android Studio,則可以使用內置的Antlr V4插件來使用Antlr分析器。
用於測試的Android Studion版本:2.3.1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.