我是使用antlr 4的新手,從未寫過語法。語法對於短小的樣本似乎可以正常工作,但是我有一些更長的例子會在一夜之間沒有完成的情況下運行。我正在使用TestRig和我的輸入文件。我使用JVisualVM並觀察代碼花費大部分時間在這裏:性能問題我的語法和antlr4
Org.antlr.v4.runtime.atn.ArrayPredictionContext.equals(Object) (89.8%)
Org.antlr.v4.runtime.atn.SingletonPredictionContext.equals(Object) (7.4%)
Org.antlr.v4.runtime.misc.DoubleKeyMap.put(Object,Object,Object) (1.8%)
Org.antlr.v4.runtime.misc.DoubleKeyMap.get(Object, Object) (0.9%)
該問題似乎與以下格式的語句的音量有關。
reservedWord = quotedstring
12和這些問題的72之間的某處發生
我已授予的存儲器中的JVM 2G和它使用小於1G。堆的增長和縮小,所以我不相信有內存泄漏。
任何關於如何調試的建議?
我沒有看到一種方法來附加一個文件和堆棧跟蹤是422線主要是重複1278和1325.我不明白TestRig,所以我不知道它在做什麼。如果我能找到它,將獲得antlr-4.0-complete.jar的源代碼。
at org.antlr.v4.runtime.atn.PredictionContext.hashCode(PredictionContext.java:121)
at org.antlr.v4.runtime.atn.SingletonPredictionContext.equals(SingletonPredictionContext.java:97)
at java.util.HashMap.getEntry(HashMap.java:349)
at java.util.LinkedHashMap.get(LinkedHashMap.java:280)
at org.antlr.v4.runtime.misc.DoubleKeyMap.get(DoubleKeyMap.java:60)
at org.antlr.v4.runtime.atn.PredictionContext.mergeSingletons(PredictionContext.java:204)
at org.antlr.v4.runtime.atn.PredictionContext.merge(PredictionContext.java:138)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:354)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1293)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
<repeat a lot 1278 and 1325>
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1261)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1261)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1261)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure_(ParserATNSimulator.java:1325)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closureCheckingStopState(ParserATNSimulator.java:1278)
at org.antlr.v4.runtime.atn.ParserATNSimulator.closure(ParserATNSimulator.java:1216)
at org.antlr.v4.runtime.atn.ParserATNSimulator.computeReachSet(ParserATNSimulator.java:988)
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATNWithFullContext(ParserATNSimulator.java:801)
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATN(ParserATNSimulator.java:701)
at org.antlr.v4.runtime.atn.ParserATNSimulator.predictATN(ParserATNSimulator.java:389)
at org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:346)
at ValidatingPolicyParser.showstatement(ValidatingPolicyParser.java:1023)
at ValidatingPolicyParser.statement(ValidatingPolicyParser.java:685)
at ValidatingPolicyParser.policy(ValidatingPolicyParser.java:246)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.antlr.v4.runtime.misc.TestRig.process(TestRig.java:247)
at org.antlr.v4.runtime.misc.TestRig.process(TestRig.java:209)
at org.antlr.v4.runtime.misc.TestRig.main(TestRig.java:142)
我開始研究修剪下來的語法作爲測試用例。這個練習確實幫助我找出了一些我從語法中刪除的古怪事物。這解決了我的修剪下來的語法的問題,但是當我恢復完整的語法時,性能問題返回。
增加一個簡單比較的出現次數對我來說真的很奇怪,這會非線性地增加處理時間。 「TOKEN =」SOMESTRING「或TOKEN =」SOMEOTHERSTING「的一些實例處理速度相對較快,但如果我有75個這樣的比較,處理時間會變得太多。
我無法確定antlr4源在某處是否可用。很高興能夠通過代碼來看看發生了什麼。
我猜我會重複這個過程,看看它產生了什麼。
聽起來像這個鏈接是無效的,鏈接已被我們的版主英雄刪除! – asyncwait 2014-02-19 19:39:36
@asyncwait:那個鏈接只是解釋了profilers中所有沒有幫助的概念,以及爲什麼他們不這樣做。 [*這是一個替代*](http://stackoverflow.com/a/378024/23771),說少,但有更多的選票,FWIW。 – 2014-02-19 19:46:58