ANTLR4:Java-TokenStreamRewriter getText()方法的性能问题

问题描述 投票:0回答:1

我在使用ANTLR4-Java TokenStreamRewriter getText()方法时遇到性能问题。此方法花费太多时间才能获得结果。请在下面检查我的用例和观察结果,并让我知道为什么这会花费很长时间,并且此问题的解决方法是什么?

用例:我有一个大小为17 MB的Sql文本文件,解析该文件后,我们正在使用TokenStreamRewriter API修改令牌流中的许多内容。完成所有修改后,我们使用TokenStreamRewriter的getText()方法获取修改后的文本。getText()方法要花费5分钟以上的时间才能获取修改后的结果。

我已经测试了文件大小为54MB,这一次getText()方法花费了大约110分钟的时间来获取修改后的结果。

[在我分析期间,我发现花费更多时间的方法是:TokenStreamRewriter.reduceToSingleOperationPerIndex()我已经捕获了此方法的一些执行细节,请参考以下信息

对于17MB文件:

2020-05-14 17:22:33,187 INFO CustomTokenStreamRewriter:392 No of rewrites=164570
2020-05-14 17:22:33,187 INFO CustomTokenStreamRewriter:395 Start Walk Replaces
2020-05-14 17:25:35,874 INFO CustomTokenStreamRewriter:438 End Walk Replaces
2020-05-14 17:25:35,956 INFO CustomTokenStreamRewriter:441 Start Walk Inserts
2020-05-14 17:27:49,723 INFO CustomTokenStreamRewriter:476 End Walk Inserts
2020-05-14 17:27:49,732 INFO CustomTokenStreamRewriter:477 rewrites size after=164570
2020-05-14 17:27:49,732 INFO CustomTokenStreamRewriter:478 Start Walk after
2020-05-14 17:27:49,830 INFO CustomTokenStreamRewriter:488 End Walk after

对于54MB文件:

2020-05-14 17:33:29,650 INFO CustomTokenStreamRewriter:392 No of rewrites=493728
2020-05-14 17:33:29,651 INFO CustomTokenStreamRewriter:395 Start Walk Replaces
2020-05-14 18:36:26,294 INFO CustomTokenStreamRewriter:438 End Walk Replaces
2020-05-14 18:36:26,362 INFO CustomTokenStreamRewriter:441 Start Walk Inserts
2020-05-14 19:21:56,112 INFO CustomTokenStreamRewriter:476 End Walk Inserts
2020-05-14 19:21:56,131 INFO CustomTokenStreamRewriter:477 rewrites size after=493728
2020-05-14 19:21:56,132 INFO CustomTokenStreamRewriter:478 Start Walk after
2020-05-14 19:21:56,224 INFO CustomTokenStreamRewriter:488 End Walk after

Env详细信息:高端Linux计算机,内存(xmx)值设置为:30 GB

java performance antlr antlr4
1个回答
0
投票

TokenStreamRewriter很懒。因此,与该问题所暗示的相反,您没有调用getText after来执行修改,而只是获取修改后的文本。修改仅由API排队。当您调用getTextthen时,实际的工作就会发生。

由于在17兆字节的标记化输入中将工作描述为“修改许多事情”,所以5分钟听起来不算太过分。

我想答案是:您没有遇到getText的任何问题,您只是观察排队的转换的总时间。是否可以优化它们,似乎是另一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.