antlr4在多个线程中不能完美缩放

时间:2016-01-03 11:40:39

标签: sql multithreading antlr4

我写了一个oracle sql语法。似乎为解析多个文件而投入更多线程并不会线性加速。相反,有更多线程,内部antlr开销显着增长。 从技术上讲,每个线程都有自己的一组sql文件来解析。值得一提的是,测试是在带有1 TB ssd和64 GB RAM的2处理器至强盒上运行的。 Atached是jprofiler调用图的截图。 请注意,实际计时(使用System.currentTimeMillis()测量)甚至更差 - 因此次优行为不是所使用的探查器的工件。 offending section of a run with 140 sql files using 8 threads

offending section of a run with the same 140 sql files using 4 threads

1 个答案:

答案 0 :(得分:0)

生成的Parsers和Lexers包含静态字段(_decisionToDFA,_sharedContextCache),它们在线程之间共享。也许锁定这些是一个问题?您可以测试是否手动将这些重写为ThreadLocal变量帮助。您也可以将它们作为实例变量,但是应该重用Parser和Lexer实例以继续从缓存中获益。