sts4 icon indicating copy to clipboard operation
sts4 copied to clipboard

parsing using open-rewrite is dramatically slow for larger source files

Open martinlippert opened this issue 3 years ago • 4 comments

I am testing with a project that contains some large files (160k lines of java source). The overall JDT parsing seems to be okay for those files, but the open rewrite based parsing takes ages for those files and keeps the CPU busy (at least one core) for a very long time.

Looking at this briefly shows threads running with this:

ForkJoinPool.commonPool-worker-10  Runnable CPU usage on sample: 1s 1ms
  java.util.regex.Pattern$Start.match(Pattern.java:3608)
  java.util.regex.Matcher.search(Matcher.java:1728)
  java.util.regex.Matcher.find(Matcher.java:772)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.lambda$visitVariables$28(ReloadableJava17ParserVisitor.java:1387)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor$$Lambda$1028.0x000000080123ec18.get()
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitVariables(ReloadableJava17ParserVisitor.java:1394)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitVariable(ReloadableJava17ParserVisitor.java:1342)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitVariable(ReloadableJava17ParserVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:1045)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1478)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1507)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convertAll(ReloadableJava17ParserVisitor.java:1544)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitMethod(ReloadableJava17ParserVisitor.java:950)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitMethod(ReloadableJava17ParserVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1478)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1507)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convertStatements(ReloadableJava17ParserVisitor.java:1616)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convertStatements(ReloadableJava17ParserVisitor.java:1598)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitClass(ReloadableJava17ParserVisitor.java:472)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitClass(ReloadableJava17ParserVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1478)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1507)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convertStatements(ReloadableJava17ParserVisitor.java:1616)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convertStatements(ReloadableJava17ParserVisitor.java:1598)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitClass(ReloadableJava17ParserVisitor.java:472)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitClass(ReloadableJava17ParserVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convert(ReloadableJava17ParserVisitor.java:1478)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.convertAll(ReloadableJava17ParserVisitor.java:1531)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitCompilationUnit(ReloadableJava17ParserVisitor.java:518)
  org.openrewrite.java.isolated.ReloadableJava17ParserVisitor.visitCompilationUnit(ReloadableJava17ParserVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:614)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
  org.openrewrite.java.isolated.ReloadableJava17Parser.lambda$parseInputs$0(ReloadableJava17Parser.java:177)
  org.openrewrite.java.isolated.ReloadableJava17Parser$$Lambda$906.0x00000008011ef328.apply()
  java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  java.util.Iterator.forEachRemaining(Iterator.java:133)
  java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
  java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
  java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
  org.openrewrite.java.isolated.ReloadableJava17Parser.parseInputs(ReloadableJava17Parser.java:199)
  org.openrewrite.java.Java17Parser.parseInputs(Java17Parser.java:43)
  org.springframework.ide.vscode.commons.rewrite.java.ORAstUtils.parseInputs(ORAstUtils.java:233)
  org.springframework.ide.vscode.boot.java.rewrite.RewriteCompilationUnitCache.doParse(RewriteCompilationUnitCache.java:277)
  org.springframework.ide.vscode.boot.java.rewrite.RewriteCompilationUnitCache.lambda$7(RewriteCompilationUnitCache.java:234)
  org.springframework.ide.vscode.boot.java.rewrite.RewriteCompilationUnitCache$$Lambda$632.0x00000008010a4350.get()
  java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
  java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
  java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
  java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
  java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
  java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
  java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

martinlippert avatar Aug 31 '22 14:08 martinlippert

Ouch... any user-facing side effects of slow parsing? If there is anything then perhaps it is best to switch back to JDT to detect.mark problems and leave quick fixes and assists to rewrite... The stack trace suggest forwarding this issue to rewrite in my opinion as this is just plain parsing without any extras I'm doing after the source is parsed.

BoykoAlex avatar Aug 31 '22 14:08 BoykoAlex

Next test in this area: project reconciling with a small project containing large source files goes crazy, quickly running out of heap space on the language server side, CPU spiking all the time.

Thread dump looks like this is the important piece: thread-dump-project-reconciling-large-sources.txt

The extremely deep call stack doesn't look good to me...

martinlippert avatar Sep 27 '22 07:09 martinlippert

@martinlippert seems like this is another one for Rewrite folks to look at... What is the project you're trying? Still the antlr parser?

BoykoAlex avatar Sep 27 '22 14:09 BoykoAlex

@BoykoAlex Yes, and I already posted a comment to the open-rewrite issue that you raised... :-)

martinlippert avatar Sep 27 '22 14:09 martinlippert