I compared the time cost by antlr2 parser and Parrot parser via running the 
following script "Parse.groovy", which is placed under directory 
"nextflow-master\modules\nextflow\src\main\groovy\nextflow"[1]:

The heap size is set to 2G, i.e. "-Xms2g -Xmx2g"

1) run antlr2 parser
`groovy Parse.groovy 2`

cost 57.177s

2) run Parrot parser:
`groovy Parse.groovy 4`

As 364 groovy source files in all, we set threshold to 600 (> 364) to avoid 
cache being cleared
with "-Dgroovy.antlr4.cache.threshold=600": cost 58.672s    // almost same to 
antlr2 parser

without "groovy.antlr4.cache.threshold" setting: cost 67.183s

(Parse.groovy)
```
import groovy.io.FileType
import org.apache.groovy.parser.*

def parserVer = args[0]

def result = []
def parser = '4' == parserVer ? new Antlr4Parser() : new Antlr2Parser()
println "${parser.class} enabled!"

new File('.').eachFileRecurse (FileType.FILES) { file ->
  if (!file.name.endsWith('.groovy')) return
  
  println "Parsing $file"
  
  def b = System.currentTimeMillis()
  parser.parse(file)
  def e = System.currentTimeMillis()
  
  result << Tuple.tuple((e - b), file)
}

println "------------ RESULT --------------"
result.sort { o1, o2 -> o2.v1 <=> o1.v1 }.each {
        println "${it.v1 / 1000}s\t\t\t\t\t${it.v2}"
}

println "# ${result.sum { it.v1 } / 1000}s elapsed"

```


Cheers,
Daniel.Sun
[1] https://github.com/nextflow-io/nextflow/archive/master.zip

On 2020/01/17 18:08:22, "Daniel.Sun" <sun...@apache.org> wrote: 
> If you find the performance issue is gone when you disable the Parrot parser
> with `-Dgroovy.antlr4=false`, you can try to enable the Parrot parser again
> and apply `-Dgroovy.antlr4.cache.threshold=200` shown as follows. 
> 
> ```
> compileGroovy {
>     groovyOptions.fork = true
>     groovyOptions.forkOptions.jvmArgs +=
> ["-Dgroovy.antlr4.cache.threshold=200"] // you can try to increase the
> threshold if your project contains many Groovy source files.
> }
> ```
> 
> The greater the value of threshold is, the longer the cache will be
> reused(i.e. not be cleared), but it will require bigger JVM heap. 
> 
> Note: antlr4 recommends never to clear the cache for better performance, but
> Parrot parser will clear the cache to avoid OOME when threshold reaches.
> 
> Cheers,
> Daniel.Sun
> 
> 
> 
> -----
> Apache Groovy committer & PMC member 
> Blog: http://blog.sunlan.me 
> Twitter: @daniel_sun 
> 
> --
> Sent from: http://groovy.329449.n5.nabble.com/Groovy-Dev-f372993.html
> 

Reply via email to