2013-04-10 75 views
1

我是使用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源在某處是否可用。很高興能夠通過代碼來看看發生了什麼。

我猜我會重複這個過程,看看它產生了什麼。

回答

1

那些時間數字是沒用的。他們告訴你epsilon。

相反,只是打斷它。你會在行爲中捕捉到它。檢查調用堆棧,並在必要時檢查數據變量。如果你明白這個時間點正在做什麼,你就會知道問題是什麼。

More than you ever wanted to know about that.

+0

聽起來像這個鏈接是無效的,鏈接已被我們的版主英雄刪除! – asyncwait 2014-02-19 19:39:36

+0

@asyncwait:那個鏈接只是解釋了profilers中所有沒有幫助的概念,以及爲什麼他們不這樣做。 [*這是一個替代*](http://stackoverflow.com/a/378024/23771),說少,但有更多的選票,FWIW。 – 2014-02-19 19:46:58

0

好,我發現我的語法問題。花了很多試驗和錯誤。我不知道在antlr4中是否使用了遞歸?