Thanks,

By precompilation, I was thinking of a real ".class" or an intermediary
format I can persist in my jars with by example a maven plugin.
I have groovy scripts that I compile/cache the first time the script is
used. This process takes minutes with the parrot parser, and seconds with
the old one.

Regards,
Jérémie

Le sam. 23 juil. 2022 à 15:34, o...@ocs.cz <o...@ocs.cz> a écrit :

> 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 <jeremie.bre...@gmail.com> 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
>
>
>

Reply via email to