Re: Groovy 4 and Parrot Parser performances

"[email protected]" <[email protected]>
Newsgroups gmane.comp.lang.groovy.user
Message-ID <[email protected]>
Jérémie,

you definitely can precompile scripts. There might be a better/simpler/more reliable way, but what I use for years is essentially this (somewhat simplified for better readability):

===
    @Lazy() static emptyBinding=new Binding()
    @Lazy() static shell={
        def cc=new CompilerConfiguration()
        cc.scriptBaseClass=ExpressionScript.name
        // ... further setup as need be, compilation customizers etc
        new GroovyShell(new GroovyClassLoader(),emptyBinding,cc)
    }()
    @Lazy(soft=YES) static compiledExpressionCache={ [:] }()

    static private final cacheLock=new Object()
    static evaluate(Map bind,String expression,representedObject) {
        ExpressionScript script
        def result=nil
        synchronized (cacheLock) {
            def scripts=compiledExpressionCache[expression].get()
            if (!scripts) {
                try { script=shell.parse(expr) }
                catch (exc) {
                    result="ERROR: $exc.message IN EXPRESSION '$expression'"
                }
                shell.classLoader.clearCache()
                if (script) compiledExpressionCache[expression]=new java.lang.ref.SoftReference([script])
            } else {
                script=scripts.find { ExpressionScript sc ->
                    sc.representedObject==null // represented object used (also) as a flag that the script is being processed
                }
                if (!script) {
                    script=scripts[0].getClass().newInstance()
                    scripts<<script
                }
            }
            script.binding=new Binding(bind) // beware: setting bindins ZEROES representedObject!
            script.representedObject=representedObject
        }
        if (!result) try { result=script.run() }} finally {
            script.binding=emptyBinding // also zeroes representedObject
        }
        result
    }
===

All the best,
OC

> On 23. 7. 2022, at 15:02, Jérémie <[email protected]> wrote:
> 
> Hello,
> 
> I am using Groovy 3 in my project, but I had to turn off the new parser because of its performance. 
> In my benchmark, the loading time of most of my scripts are multiplied by 12. I didn't succeed in reducing this time by using the system properties, so I had to turn it off.
> 
> In Groovy 4, the old parser has been removed (?). Are the perf of the new parser the same as of Groovy 3 ?
> If not, is there a way to precompile these scripts ? (they are not real groovy classes but custom Script classes).
> 
> Regards,
> Jérémie
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.