You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@grails.apache.org by Gianluca Sartori <g....@gmail.com> on 2025/10/06 13:51:44 UTC
Re: GSP generation, Groovy 4 slower than Groovy 3?
Hi James, David,
I've run our tests with the latest Grails 7.0.0-SNAPSHOT as James suggested
and things seem to have improved a lot.
Still a tiny bit slowish, but I would say that now the results are
comparable, also with INDY ON.
That is great, thank you David, I feel better now :)
Here they are:
(Page 1 and Page 2 are different pages than those used in early tests so
the absolute value is different than earlier)
Grails 6/Groovy 3
Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Grails 7/Groovy 4 - INDY OFF
Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1384ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1439ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1416ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 26ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 55ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Grails 7/Groovy 4 - INDY ON
Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
--
https://dueuno.com
On Wed, 24 Sept 2025 at 15:16, Gianluca Sartori <g....@gmail.com> wrote:
> As suggested, we tested building a JAR. The results are good enough for us
> to consider them production quality, although performance is still almost
> twice as slow on common use cases (small pages with few objects to render).
> Groovy INDY is set to OFF.
>
>
> Grails 6/Groovy 3
> =================
>
> Stress Test:
> TRANSITION rendered in 1564ms
> TRANSITION rendered in 1292ms
> TRANSITION rendered in 1249ms
> TRANSITION rendered in 1288ms
>
> Page 1:
> TRANSITION rendered in 32ms
>
> Page 2:
> TRANSITION rendered in 43ms
>
>
> Grails 7/Groovy 4
> =================
>
> Stress Test:
> TRANSITION rendered in 1607ms
> TRANSITION rendered in 1422ms
> TRANSITION rendered in 1444ms
> TRANSITION rendered in 1470ms
>
> Page 1:
> TRANSITION rendered in 64ms
>
> Page 2:
> TRANSITION rendered in 73ms
>
>
>
> Gianluca Sartori
> --
> https://dueuno.com
>
>
> On Mon, 22 Sept 2025 at 15:03, James Daugherty via dev <
> dev@grails.apache.org> wrote:
>
>> Hi Gianluca,
>>
>> When you say debug mode, you are doing all of your performance testing
>> with
>> debug mode? I would highly encourage you to test with runWar or runJar
>> without debug mode. Debug mode has historically always been significantly
>> slower.
>>
>> -James
>>
>> On Mon, Sep 22, 2025 at 4:30 AM Gianluca Sartori <g....@gmail.com>
>> wrote:
>>
>> > Hi David,
>> >
>> > Thank you for your reply, we've done the tests on the same code, the
>> > "only" difference is Grails 6 VS Grails 7. Tests are not in
>> > production, but locally from the IDE in debug mode. Yet grails 6 VS
>> > Grails 7 tests share the same environment.
>> >
>> > We have a hierarchy of objects to build any view, those objects go
>> > from a simple container to a Table that has a Body, a set of Rows,
>> > each row has many Cells each cell can have a Label or many other
>> > components.
>> >
>> > This hierarchy is rendered with GSP fragments (templates) so yes we
>> > may have a lot going on under a rendered Table. I know that most of
>> > the time is taken by the "layout engine" (?) because we've optimized
>> > the Table rendering just by limiting the number of components, thus
>> > embedding them instead of including them as separate templates.
>> >
>> > On the slowness, it is consistently slow but the warmup I've done was
>> > a couple of browser refreshes by hand just to compile the GSPs, I
>> > didn't go through a loop of 10.000 requests.
>> >
>> > About dynamically compiling GSP in production, we haven't specified
>> > anything in the standard 'application.yml' config, but my senses feel
>> > that even in production the first rendering takes longer I've always
>> > thought it was because of GSP compilation and it is not a problem to
>> > us.
>> >
>> >
>> > Gianluca Sartori
>> > --
>> > https://dueuno.com
>> >
>> > On Sun, 21 Sept 2025 at 17:18, David Estes <da...@gmail.com>
>> wrote:
>> > >
>> > > A bit surprising . Is it consistently slower or just the first few
>> > times? Once it warms up it should still be ok for production no? Or are
>> > you dynamically compiling gsp in prod?
>> > >
>> > > I agree it should be further optimized , but dismissing it for initial
>> > performance seems aggressive. Unless it’s consistently significant on
>> > slowness .
>> > >
>> > > That being said those render times in general seem very high for most
>> > GSP I even render . Is there a large amount of taglib usage, layouts,
>> etc?
>> > Narrowing down what might be causing overall slow page renders may be
>> worth
>> > a gander. With those times I doubt it’s strictly GSP.
>> > >
>> > >
>> > > > On Sep 21, 2025, at 9:26 AM, Gianluca Sartori <g....@gmail.com>
>> > wrote:
>> > > >
>> > > > I guess we need to find a solution refactoring GSP, rendering of
>> > pages must
>> > > > be as fast as possible.
>> > > >
>> > > > I will try to find time to give it a look but this means Grails 7 is
>> > out of
>> > > > scope for us at the moment.
>> > > >
>> > > > Unless we can run it with Groovy 3, i don’t like this, but if it
>> > solves the
>> > > > issue it would make it for us, do you think that would be possible?
>> > > >
>> > > > Should we switch to another templare solution? Which one would you
>> > suggest?
>> > > >
>> > > > Cheers,
>> > > >
>> > > > Gianluca Sartori
>> > > > --
>> > > > https://dueuno.com
>> > > >
>> > > >
>> > > > ---------- Forwarded message ---------
>> > > > From: Daniel Sun <su...@apache.org>
>> > > > Date: Sat, 20 Sep 2025 at 01:46
>> > > > Subject: Re: GSP generation, Groovy 4 slower than Groovy 3?
>> > > > To: <de...@groovy.apache.org>
>> > > >
>> > > >
>> > > > Hi Gianluca,
>> > > >
>> > > > Groovy 4 enables indy by default. It's slower to run for the first
>> > time
>> > > > because the initialization for invokedynamic is quite expensive. (
>> See
>> > > > also: https://bugs.openjdk.org/browse/JDK-8278540 )
>> > > >
>> > > > It ususally gains best performance when the methods are invoked
>> for
>> > > > 10000+ times.
>> > > >
>> > > > BTW, Jochen proposed some optimization for current design of indy,
>> > the
>> > > > performance for the first runs will be much better when the
>> > optimization is
>> > > > done.
>> > > >
>> > > > Cheers,
>> > > > Daniel Sun
>> > > >
>> > > >> On 2025/09/16 12:18:41 Gianluca Sartori wrote:
>> > > >> Hi folks,
>> > > >>
>> > > >> we have started porting Dueuno to Grails 7/Groovy 4. We have a
>> > > >> stress-test that generates a big table (200 columns x 100 rows)
>> with
>> > > >> GSP (we are doing server-side rendering).
>> > > >>
>> > > >> I'm reporting the tests below. Is there something we can do to get
>> > > >> back the performances we had with Grails 6/Groovy 3?
>> > > >>
>> > > >> Even with INDY turned off we are almost 1sec slower on the tests,
>> more
>> > > >> than 2x slower on normal pages:
>> > > >>
>> > > >> Grails 7/Groovy 4
>> > > >> Page 1 - TRANSITION rendered in 185ms
>> > > >> Page 2 - TRANSITION rendered in 453ms
>> > > >>
>> > > >> Grails 6/Groovy 3
>> > > >> Page 1 - TRANSITION rendered in 83ms
>> > > >> Page 2 - TRANSITION rendered in 280ms
>> > > >>
>> > > >> TESTS
>> > > >> ======
>> > > >> Same URL (Table stress-test), 4 requests after 3 warmup requests
>> (not
>> > > >> shown, cold-running the app from intelliJ), measuring the Grails
>> > > >> render() execution time.
>> > > >>
>> > > >> From slower to faster:
>> > > >>
>> > > >> Grails 7 - Indy ON
>> > > >> TRANSITION rendered in 4807ms
>> > > >> TRANSITION rendered in 4779ms
>> > > >> TRANSITION rendered in 4660ms
>> > > >> TRANSITION rendered in 4699ms
>> > > >>
>> > > >> Grails 7 - Indy OFF
>> > > >> tasks.withType(GroovyCompile) {
>> > > >> groovyOptions.optimizationOptions.indy = false
>> > > >> }
>> > > >> TRANSITION rendered in 3660ms
>> > > >> TRANSITION rendered in 3442ms
>> > > >> TRANSITION rendered in 3510ms
>> > > >> TRANSITION rendered in 3700ms
>> > > >>
>> > > >> Grails 6
>> > > >> TRANSITION rendered in 2853ms
>> > > >> TRANSITION rendered in 2864ms
>> > > >> TRANSITION rendered in 2734ms
>> > > >> TRANSITION rendered in 2800ms
>> > > >>
>> > > >> Gianluca Sartori
>> > > >> --
>> > > >> https://dueuno.com
>> > > >>
>> >
>>
>
Re: GSP generation, Groovy 4 slower than Groovy 3?
Posted by Gianluca Sartori <g....@gmail.com>.
I would say they are the same, for some reason, this time, this was the
result:
Grails 7/Groovy 4 - INDY OFF
Table -> TRANSITION rendered in 1452ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1480ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1472ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1429ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 18ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 53ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Gianluca Sartori
--
https://dueuno.com
On Wed, 8 Oct 2025 at 18:57, James Daugherty <jd...@apache.org> wrote:
> Thank you for running this test. We know that David's changes are
> safe for a 7.0 release then.
>
> Curious - what are the run times with INDY off?
>
> On Wed, Oct 8, 2025 at 12:55 PM Gianluca Sartori <g....@gmail.com>
> wrote:
> >
> > Hi James,
> >
> > I've run the tests on the latest 7.0.0-SNAPSHOT.
> > These are the results, comparing only Grails 7 with INDY ON with previous
> > tests run.
> >
> > I have to admit that those tests have limitations, but I see some
> > further improvements.
> > Still a bit behind Grails 6/Groovy 3, but practically irrelevant in
> > real-world scenarios.
> >
> > LATEST
> > Grails 7/Groovy 4 - INDY ON
> > Table -> TRANSITION rendered in 1413ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1427ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1464ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1464ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> >
> > Page 1 -> TRANSITION rendered in 17ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Page 2 -> TRANSITION rendered in 51ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> >
> > PREVIOUS
> > Grails 7/Groovy 4 - INDY ON
> > Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> >
> > Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> >
> > Grails 6/Groovy 3
> > Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> >
> > Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> >
> > Gianluca Sartori
> > --
> > https://dueuno.com
> >
> >
> > On Mon, 6 Oct 2025 at 17:01, James Daugherty <jd...@apache.org>
> wrote:
> >
> > > That's great news! David is separately working on some further
> > > performance improvements. We'll discuss further in the weekly
> > > developer meeting.
> > >
> > > Regards,
> > > James
> > >
> > > On Mon, Oct 6, 2025 at 9:51 AM Gianluca Sartori <g....@gmail.com>
> > > wrote:
> > > >
> > > > Hi James, David,
> > > >
> > > > I've run our tests with the latest Grails 7.0.0-SNAPSHOT as James
> > > suggested and things seem to have improved a lot.
> > > > Still a tiny bit slowish, but I would say that now the results are
> > > comparable, also with INDY ON.
> > > >
> > > > That is great, thank you David, I feel better now :)
> > > >
> > > > Here they are:
> > > > (Page 1 and Page 2 are different pages than those used in early
> tests so
> > > the absolute value is different than earlier)
> > > > Grails 6/Groovy 3
> > > > Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > >
> > > > Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable
> View:
> > > /dueuno/elements/core/PageContent]
> > > > Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable
> View:
> > > /dueuno/elements/core/PageContent]
> > > >
> > > > Grails 7/Groovy 4 - INDY OFF
> > > > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1384ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1439ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1416ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > >
> > > > Page 1 -> TRANSITION rendered in 26ms, args: [content:ContentTable
> View:
> > > /dueuno/elements/core/PageContent]
> > > > Page 2 -> TRANSITION rendered in 55ms, args: [content:ContentTable
> View:
> > > /dueuno/elements/core/PageContent]
> > > >
> > > > Grails 7/Groovy 4 - INDY ON
> > > > Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > > Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable
> > > View: /dueuno/elements/core/PageContent]
> > > >
> > > > Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable
> View:
> > > /dueuno/elements/core/PageContent]
> > > > Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable
> View:
> > > /dueuno/elements/core/PageContent]
> > > >
> > > > --
> > > > https://dueuno.com
> > > >
> > > >
> > > > On Wed, 24 Sept 2025 at 15:16, Gianluca Sartori <g.sartori@gmail.com
> >
> > > wrote:
> > > >>
> > > >> As suggested, we tested building a JAR. The results are good enough
> for
> > > us to consider them production quality, although performance is still
> > > almost twice as slow on common use cases (small pages with few objects
> to
> > > render).
> > > >> Groovy INDY is set to OFF.
> > > >>
> > > >>
> > > >> Grails 6/Groovy 3
> > > >> =================
> > > >>
> > > >> Stress Test:
> > > >> TRANSITION rendered in 1564ms
> > > >> TRANSITION rendered in 1292ms
> > > >> TRANSITION rendered in 1249ms
> > > >> TRANSITION rendered in 1288ms
> > > >>
> > > >> Page 1:
> > > >> TRANSITION rendered in 32ms
> > > >>
> > > >> Page 2:
> > > >> TRANSITION rendered in 43ms
> > > >>
> > > >>
> > > >> Grails 7/Groovy 4
> > > >> =================
> > > >>
> > > >> Stress Test:
> > > >> TRANSITION rendered in 1607ms
> > > >> TRANSITION rendered in 1422ms
> > > >> TRANSITION rendered in 1444ms
> > > >> TRANSITION rendered in 1470ms
> > > >>
> > > >> Page 1:
> > > >> TRANSITION rendered in 64ms
> > > >>
> > > >> Page 2:
> > > >> TRANSITION rendered in 73ms
> > > >>
> > > >>
> > > >>
> > > >> Gianluca Sartori
> > > >> --
> > > >> https://dueuno.com
> > > >>
> > > >>
> > > >> On Mon, 22 Sept 2025 at 15:03, James Daugherty via dev <
> > > dev@grails.apache.org> wrote:
> > > >>>
> > > >>> Hi Gianluca,
> > > >>>
> > > >>> When you say debug mode, you are doing all of your performance
> testing
> > > with
> > > >>> debug mode? I would highly encourage you to test with runWar or
> runJar
> > > >>> without debug mode. Debug mode has historically always been
> > > significantly
> > > >>> slower.
> > > >>>
> > > >>> -James
> > > >>>
> > > >>> On Mon, Sep 22, 2025 at 4:30 AM Gianluca Sartori <
> g.sartori@gmail.com>
> > > >>> wrote:
> > > >>>
> > > >>> > Hi David,
> > > >>> >
> > > >>> > Thank you for your reply, we've done the tests on the same code,
> the
> > > >>> > "only" difference is Grails 6 VS Grails 7. Tests are not in
> > > >>> > production, but locally from the IDE in debug mode. Yet grails 6
> VS
> > > >>> > Grails 7 tests share the same environment.
> > > >>> >
> > > >>> > We have a hierarchy of objects to build any view, those objects
> go
> > > >>> > from a simple container to a Table that has a Body, a set of
> Rows,
> > > >>> > each row has many Cells each cell can have a Label or many other
> > > >>> > components.
> > > >>> >
> > > >>> > This hierarchy is rendered with GSP fragments (templates) so yes
> we
> > > >>> > may have a lot going on under a rendered Table. I know that most
> of
> > > >>> > the time is taken by the "layout engine" (?) because we've
> optimized
> > > >>> > the Table rendering just by limiting the number of components,
> thus
> > > >>> > embedding them instead of including them as separate templates.
> > > >>> >
> > > >>> > On the slowness, it is consistently slow but the warmup I've
> done was
> > > >>> > a couple of browser refreshes by hand just to compile the GSPs, I
> > > >>> > didn't go through a loop of 10.000 requests.
> > > >>> >
> > > >>> > About dynamically compiling GSP in production, we haven't
> specified
> > > >>> > anything in the standard 'application.yml' config, but my senses
> feel
> > > >>> > that even in production the first rendering takes longer I've
> always
> > > >>> > thought it was because of GSP compilation and it is not a
> problem to
> > > >>> > us.
> > > >>> >
> > > >>> >
> > > >>> > Gianluca Sartori
> > > >>> > --
> > > >>> > https://dueuno.com
> > > >>> >
> > > >>> > On Sun, 21 Sept 2025 at 17:18, David Estes <davydotcom@gmail.com
> >
> > > wrote:
> > > >>> > >
> > > >>> > > A bit surprising . Is it consistently slower or just the first
> few
> > > >>> > times? Once it warms up it should still be ok for production no?
> Or
> > > are
> > > >>> > you dynamically compiling gsp in prod?
> > > >>> > >
> > > >>> > > I agree it should be further optimized , but dismissing it for
> > > initial
> > > >>> > performance seems aggressive. Unless it’s consistently
> significant on
> > > >>> > slowness .
> > > >>> > >
> > > >>> > > That being said those render times in general seem very high
> for
> > > most
> > > >>> > GSP I even render . Is there a large amount of taglib usage,
> > > layouts, etc?
> > > >>> > Narrowing down what might be causing overall slow page renders
> may
> > > be worth
> > > >>> > a gander. With those times I doubt it’s strictly GSP.
> > > >>> > >
> > > >>> > >
> > > >>> > > > On Sep 21, 2025, at 9:26 AM, Gianluca Sartori <
> > > g.sartori@gmail.com>
> > > >>> > wrote:
> > > >>> > > >
> > > >>> > > > I guess we need to find a solution refactoring GSP,
> rendering of
> > > >>> > pages must
> > > >>> > > > be as fast as possible.
> > > >>> > > >
> > > >>> > > > I will try to find time to give it a look but this means
> Grails
> > > 7 is
> > > >>> > out of
> > > >>> > > > scope for us at the moment.
> > > >>> > > >
> > > >>> > > > Unless we can run it with Groovy 3, i don’t like this, but
> if it
> > > >>> > solves the
> > > >>> > > > issue it would make it for us, do you think that would be
> > > possible?
> > > >>> > > >
> > > >>> > > > Should we switch to another templare solution? Which one
> would
> > > you
> > > >>> > suggest?
> > > >>> > > >
> > > >>> > > > Cheers,
> > > >>> > > >
> > > >>> > > > Gianluca Sartori
> > > >>> > > > --
> > > >>> > > > https://dueuno.com
> > > >>> > > >
> > > >>> > > >
> > > >>> > > > ---------- Forwarded message ---------
> > > >>> > > > From: Daniel Sun <su...@apache.org>
> > > >>> > > > Date: Sat, 20 Sep 2025 at 01:46
> > > >>> > > > Subject: Re: GSP generation, Groovy 4 slower than Groovy 3?
> > > >>> > > > To: <de...@groovy.apache.org>
> > > >>> > > >
> > > >>> > > >
> > > >>> > > > Hi Gianluca,
> > > >>> > > >
> > > >>> > > > Groovy 4 enables indy by default. It's slower to run for
> the
> > > first
> > > >>> > time
> > > >>> > > > because the initialization for invokedynamic is quite
> expensive.
> > > ( See
> > > >>> > > > also: https://bugs.openjdk.org/browse/JDK-8278540 )
> > > >>> > > >
> > > >>> > > > It ususally gains best performance when the methods are
> > > invoked for
> > > >>> > > > 10000+ times.
> > > >>> > > >
> > > >>> > > > BTW, Jochen proposed some optimization for current design
> of
> > > indy,
> > > >>> > the
> > > >>> > > > performance for the first runs will be much better when the
> > > >>> > optimization is
> > > >>> > > > done.
> > > >>> > > >
> > > >>> > > > Cheers,
> > > >>> > > > Daniel Sun
> > > >>> > > >
> > > >>> > > >> On 2025/09/16 12:18:41 Gianluca Sartori wrote:
> > > >>> > > >> Hi folks,
> > > >>> > > >>
> > > >>> > > >> we have started porting Dueuno to Grails 7/Groovy 4. We
> have a
> > > >>> > > >> stress-test that generates a big table (200 columns x 100
> rows)
> > > with
> > > >>> > > >> GSP (we are doing server-side rendering).
> > > >>> > > >>
> > > >>> > > >> I'm reporting the tests below. Is there something we can do
> to
> > > get
> > > >>> > > >> back the performances we had with Grails 6/Groovy 3?
> > > >>> > > >>
> > > >>> > > >> Even with INDY turned off we are almost 1sec slower on the
> > > tests, more
> > > >>> > > >> than 2x slower on normal pages:
> > > >>> > > >>
> > > >>> > > >> Grails 7/Groovy 4
> > > >>> > > >> Page 1 - TRANSITION rendered in 185ms
> > > >>> > > >> Page 2 - TRANSITION rendered in 453ms
> > > >>> > > >>
> > > >>> > > >> Grails 6/Groovy 3
> > > >>> > > >> Page 1 - TRANSITION rendered in 83ms
> > > >>> > > >> Page 2 - TRANSITION rendered in 280ms
> > > >>> > > >>
> > > >>> > > >> TESTS
> > > >>> > > >> ======
> > > >>> > > >> Same URL (Table stress-test), 4 requests after 3 warmup
> > > requests (not
> > > >>> > > >> shown, cold-running the app from intelliJ), measuring the
> Grails
> > > >>> > > >> render() execution time.
> > > >>> > > >>
> > > >>> > > >> From slower to faster:
> > > >>> > > >>
> > > >>> > > >> Grails 7 - Indy ON
> > > >>> > > >> TRANSITION rendered in 4807ms
> > > >>> > > >> TRANSITION rendered in 4779ms
> > > >>> > > >> TRANSITION rendered in 4660ms
> > > >>> > > >> TRANSITION rendered in 4699ms
> > > >>> > > >>
> > > >>> > > >> Grails 7 - Indy OFF
> > > >>> > > >> tasks.withType(GroovyCompile) {
> > > >>> > > >> groovyOptions.optimizationOptions.indy = false
> > > >>> > > >> }
> > > >>> > > >> TRANSITION rendered in 3660ms
> > > >>> > > >> TRANSITION rendered in 3442ms
> > > >>> > > >> TRANSITION rendered in 3510ms
> > > >>> > > >> TRANSITION rendered in 3700ms
> > > >>> > > >>
> > > >>> > > >> Grails 6
> > > >>> > > >> TRANSITION rendered in 2853ms
> > > >>> > > >> TRANSITION rendered in 2864ms
> > > >>> > > >> TRANSITION rendered in 2734ms
> > > >>> > > >> TRANSITION rendered in 2800ms
> > > >>> > > >>
> > > >>> > > >> Gianluca Sartori
> > > >>> > > >> --
> > > >>> > > >> https://dueuno.com
> > > >>> > > >>
> > > >>> >
> > >
>
Re: GSP generation, Groovy 4 slower than Groovy 3?
Posted by James Daugherty <jd...@apache.org>.
Thank you for running this test. We know that David's changes are
safe for a 7.0 release then.
Curious - what are the run times with INDY off?
On Wed, Oct 8, 2025 at 12:55 PM Gianluca Sartori <g....@gmail.com> wrote:
>
> Hi James,
>
> I've run the tests on the latest 7.0.0-SNAPSHOT.
> These are the results, comparing only Grails 7 with INDY ON with previous
> tests run.
>
> I have to admit that those tests have limitations, but I see some
> further improvements.
> Still a bit behind Grails 6/Groovy 3, but practically irrelevant in
> real-world scenarios.
>
> LATEST
> Grails 7/Groovy 4 - INDY ON
> Table -> TRANSITION rendered in 1413ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1427ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1464ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1464ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
>
> Page 1 -> TRANSITION rendered in 17ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Page 2 -> TRANSITION rendered in 51ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
>
> PREVIOUS
> Grails 7/Groovy 4 - INDY ON
> Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
>
> Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
>
> Grails 6/Groovy 3
> Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
>
> Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
>
> Gianluca Sartori
> --
> https://dueuno.com
>
>
> On Mon, 6 Oct 2025 at 17:01, James Daugherty <jd...@apache.org> wrote:
>
> > That's great news! David is separately working on some further
> > performance improvements. We'll discuss further in the weekly
> > developer meeting.
> >
> > Regards,
> > James
> >
> > On Mon, Oct 6, 2025 at 9:51 AM Gianluca Sartori <g....@gmail.com>
> > wrote:
> > >
> > > Hi James, David,
> > >
> > > I've run our tests with the latest Grails 7.0.0-SNAPSHOT as James
> > suggested and things seem to have improved a lot.
> > > Still a tiny bit slowish, but I would say that now the results are
> > comparable, also with INDY ON.
> > >
> > > That is great, thank you David, I feel better now :)
> > >
> > > Here they are:
> > > (Page 1 and Page 2 are different pages than those used in early tests so
> > the absolute value is different than earlier)
> > > Grails 6/Groovy 3
> > > Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > >
> > > Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > > Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > >
> > > Grails 7/Groovy 4 - INDY OFF
> > > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1384ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1439ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1416ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > >
> > > Page 1 -> TRANSITION rendered in 26ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > > Page 2 -> TRANSITION rendered in 55ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > >
> > > Grails 7/Groovy 4 - INDY ON
> > > Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > > Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable
> > View: /dueuno/elements/core/PageContent]
> > >
> > > Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > > Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View:
> > /dueuno/elements/core/PageContent]
> > >
> > > --
> > > https://dueuno.com
> > >
> > >
> > > On Wed, 24 Sept 2025 at 15:16, Gianluca Sartori <g....@gmail.com>
> > wrote:
> > >>
> > >> As suggested, we tested building a JAR. The results are good enough for
> > us to consider them production quality, although performance is still
> > almost twice as slow on common use cases (small pages with few objects to
> > render).
> > >> Groovy INDY is set to OFF.
> > >>
> > >>
> > >> Grails 6/Groovy 3
> > >> =================
> > >>
> > >> Stress Test:
> > >> TRANSITION rendered in 1564ms
> > >> TRANSITION rendered in 1292ms
> > >> TRANSITION rendered in 1249ms
> > >> TRANSITION rendered in 1288ms
> > >>
> > >> Page 1:
> > >> TRANSITION rendered in 32ms
> > >>
> > >> Page 2:
> > >> TRANSITION rendered in 43ms
> > >>
> > >>
> > >> Grails 7/Groovy 4
> > >> =================
> > >>
> > >> Stress Test:
> > >> TRANSITION rendered in 1607ms
> > >> TRANSITION rendered in 1422ms
> > >> TRANSITION rendered in 1444ms
> > >> TRANSITION rendered in 1470ms
> > >>
> > >> Page 1:
> > >> TRANSITION rendered in 64ms
> > >>
> > >> Page 2:
> > >> TRANSITION rendered in 73ms
> > >>
> > >>
> > >>
> > >> Gianluca Sartori
> > >> --
> > >> https://dueuno.com
> > >>
> > >>
> > >> On Mon, 22 Sept 2025 at 15:03, James Daugherty via dev <
> > dev@grails.apache.org> wrote:
> > >>>
> > >>> Hi Gianluca,
> > >>>
> > >>> When you say debug mode, you are doing all of your performance testing
> > with
> > >>> debug mode? I would highly encourage you to test with runWar or runJar
> > >>> without debug mode. Debug mode has historically always been
> > significantly
> > >>> slower.
> > >>>
> > >>> -James
> > >>>
> > >>> On Mon, Sep 22, 2025 at 4:30 AM Gianluca Sartori <g....@gmail.com>
> > >>> wrote:
> > >>>
> > >>> > Hi David,
> > >>> >
> > >>> > Thank you for your reply, we've done the tests on the same code, the
> > >>> > "only" difference is Grails 6 VS Grails 7. Tests are not in
> > >>> > production, but locally from the IDE in debug mode. Yet grails 6 VS
> > >>> > Grails 7 tests share the same environment.
> > >>> >
> > >>> > We have a hierarchy of objects to build any view, those objects go
> > >>> > from a simple container to a Table that has a Body, a set of Rows,
> > >>> > each row has many Cells each cell can have a Label or many other
> > >>> > components.
> > >>> >
> > >>> > This hierarchy is rendered with GSP fragments (templates) so yes we
> > >>> > may have a lot going on under a rendered Table. I know that most of
> > >>> > the time is taken by the "layout engine" (?) because we've optimized
> > >>> > the Table rendering just by limiting the number of components, thus
> > >>> > embedding them instead of including them as separate templates.
> > >>> >
> > >>> > On the slowness, it is consistently slow but the warmup I've done was
> > >>> > a couple of browser refreshes by hand just to compile the GSPs, I
> > >>> > didn't go through a loop of 10.000 requests.
> > >>> >
> > >>> > About dynamically compiling GSP in production, we haven't specified
> > >>> > anything in the standard 'application.yml' config, but my senses feel
> > >>> > that even in production the first rendering takes longer I've always
> > >>> > thought it was because of GSP compilation and it is not a problem to
> > >>> > us.
> > >>> >
> > >>> >
> > >>> > Gianluca Sartori
> > >>> > --
> > >>> > https://dueuno.com
> > >>> >
> > >>> > On Sun, 21 Sept 2025 at 17:18, David Estes <da...@gmail.com>
> > wrote:
> > >>> > >
> > >>> > > A bit surprising . Is it consistently slower or just the first few
> > >>> > times? Once it warms up it should still be ok for production no? Or
> > are
> > >>> > you dynamically compiling gsp in prod?
> > >>> > >
> > >>> > > I agree it should be further optimized , but dismissing it for
> > initial
> > >>> > performance seems aggressive. Unless it’s consistently significant on
> > >>> > slowness .
> > >>> > >
> > >>> > > That being said those render times in general seem very high for
> > most
> > >>> > GSP I even render . Is there a large amount of taglib usage,
> > layouts, etc?
> > >>> > Narrowing down what might be causing overall slow page renders may
> > be worth
> > >>> > a gander. With those times I doubt it’s strictly GSP.
> > >>> > >
> > >>> > >
> > >>> > > > On Sep 21, 2025, at 9:26 AM, Gianluca Sartori <
> > g.sartori@gmail.com>
> > >>> > wrote:
> > >>> > > >
> > >>> > > > I guess we need to find a solution refactoring GSP, rendering of
> > >>> > pages must
> > >>> > > > be as fast as possible.
> > >>> > > >
> > >>> > > > I will try to find time to give it a look but this means Grails
> > 7 is
> > >>> > out of
> > >>> > > > scope for us at the moment.
> > >>> > > >
> > >>> > > > Unless we can run it with Groovy 3, i don’t like this, but if it
> > >>> > solves the
> > >>> > > > issue it would make it for us, do you think that would be
> > possible?
> > >>> > > >
> > >>> > > > Should we switch to another templare solution? Which one would
> > you
> > >>> > suggest?
> > >>> > > >
> > >>> > > > Cheers,
> > >>> > > >
> > >>> > > > Gianluca Sartori
> > >>> > > > --
> > >>> > > > https://dueuno.com
> > >>> > > >
> > >>> > > >
> > >>> > > > ---------- Forwarded message ---------
> > >>> > > > From: Daniel Sun <su...@apache.org>
> > >>> > > > Date: Sat, 20 Sep 2025 at 01:46
> > >>> > > > Subject: Re: GSP generation, Groovy 4 slower than Groovy 3?
> > >>> > > > To: <de...@groovy.apache.org>
> > >>> > > >
> > >>> > > >
> > >>> > > > Hi Gianluca,
> > >>> > > >
> > >>> > > > Groovy 4 enables indy by default. It's slower to run for the
> > first
> > >>> > time
> > >>> > > > because the initialization for invokedynamic is quite expensive.
> > ( See
> > >>> > > > also: https://bugs.openjdk.org/browse/JDK-8278540 )
> > >>> > > >
> > >>> > > > It ususally gains best performance when the methods are
> > invoked for
> > >>> > > > 10000+ times.
> > >>> > > >
> > >>> > > > BTW, Jochen proposed some optimization for current design of
> > indy,
> > >>> > the
> > >>> > > > performance for the first runs will be much better when the
> > >>> > optimization is
> > >>> > > > done.
> > >>> > > >
> > >>> > > > Cheers,
> > >>> > > > Daniel Sun
> > >>> > > >
> > >>> > > >> On 2025/09/16 12:18:41 Gianluca Sartori wrote:
> > >>> > > >> Hi folks,
> > >>> > > >>
> > >>> > > >> we have started porting Dueuno to Grails 7/Groovy 4. We have a
> > >>> > > >> stress-test that generates a big table (200 columns x 100 rows)
> > with
> > >>> > > >> GSP (we are doing server-side rendering).
> > >>> > > >>
> > >>> > > >> I'm reporting the tests below. Is there something we can do to
> > get
> > >>> > > >> back the performances we had with Grails 6/Groovy 3?
> > >>> > > >>
> > >>> > > >> Even with INDY turned off we are almost 1sec slower on the
> > tests, more
> > >>> > > >> than 2x slower on normal pages:
> > >>> > > >>
> > >>> > > >> Grails 7/Groovy 4
> > >>> > > >> Page 1 - TRANSITION rendered in 185ms
> > >>> > > >> Page 2 - TRANSITION rendered in 453ms
> > >>> > > >>
> > >>> > > >> Grails 6/Groovy 3
> > >>> > > >> Page 1 - TRANSITION rendered in 83ms
> > >>> > > >> Page 2 - TRANSITION rendered in 280ms
> > >>> > > >>
> > >>> > > >> TESTS
> > >>> > > >> ======
> > >>> > > >> Same URL (Table stress-test), 4 requests after 3 warmup
> > requests (not
> > >>> > > >> shown, cold-running the app from intelliJ), measuring the Grails
> > >>> > > >> render() execution time.
> > >>> > > >>
> > >>> > > >> From slower to faster:
> > >>> > > >>
> > >>> > > >> Grails 7 - Indy ON
> > >>> > > >> TRANSITION rendered in 4807ms
> > >>> > > >> TRANSITION rendered in 4779ms
> > >>> > > >> TRANSITION rendered in 4660ms
> > >>> > > >> TRANSITION rendered in 4699ms
> > >>> > > >>
> > >>> > > >> Grails 7 - Indy OFF
> > >>> > > >> tasks.withType(GroovyCompile) {
> > >>> > > >> groovyOptions.optimizationOptions.indy = false
> > >>> > > >> }
> > >>> > > >> TRANSITION rendered in 3660ms
> > >>> > > >> TRANSITION rendered in 3442ms
> > >>> > > >> TRANSITION rendered in 3510ms
> > >>> > > >> TRANSITION rendered in 3700ms
> > >>> > > >>
> > >>> > > >> Grails 6
> > >>> > > >> TRANSITION rendered in 2853ms
> > >>> > > >> TRANSITION rendered in 2864ms
> > >>> > > >> TRANSITION rendered in 2734ms
> > >>> > > >> TRANSITION rendered in 2800ms
> > >>> > > >>
> > >>> > > >> Gianluca Sartori
> > >>> > > >> --
> > >>> > > >> https://dueuno.com
> > >>> > > >>
> > >>> >
> >
Re: GSP generation, Groovy 4 slower than Groovy 3?
Posted by Gianluca Sartori <g....@gmail.com>.
Hi James,
I've run the tests on the latest 7.0.0-SNAPSHOT.
These are the results, comparing only Grails 7 with INDY ON with previous
tests run.
I have to admit that those tests have limitations, but I see some
further improvements.
Still a bit behind Grails 6/Groovy 3, but practically irrelevant in
real-world scenarios.
LATEST
Grails 7/Groovy 4 - INDY ON
Table -> TRANSITION rendered in 1413ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1427ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1464ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1464ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 17ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 51ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
PREVIOUS
Grails 7/Groovy 4 - INDY ON
Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Grails 6/Groovy 3
Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View:
/dueuno/elements/core/PageContent]
Gianluca Sartori
--
https://dueuno.com
On Mon, 6 Oct 2025 at 17:01, James Daugherty <jd...@apache.org> wrote:
> That's great news! David is separately working on some further
> performance improvements. We'll discuss further in the weekly
> developer meeting.
>
> Regards,
> James
>
> On Mon, Oct 6, 2025 at 9:51 AM Gianluca Sartori <g....@gmail.com>
> wrote:
> >
> > Hi James, David,
> >
> > I've run our tests with the latest Grails 7.0.0-SNAPSHOT as James
> suggested and things seem to have improved a lot.
> > Still a tiny bit slowish, but I would say that now the results are
> comparable, also with INDY ON.
> >
> > That is great, thank you David, I feel better now :)
> >
> > Here they are:
> > (Page 1 and Page 2 are different pages than those used in early tests so
> the absolute value is different than earlier)
> > Grails 6/Groovy 3
> > Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> >
> > Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> > Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> >
> > Grails 7/Groovy 4 - INDY OFF
> > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1384ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1439ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1416ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> >
> > Page 1 -> TRANSITION rendered in 26ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> > Page 2 -> TRANSITION rendered in 55ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> >
> > Grails 7/Groovy 4 - INDY ON
> > Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> > Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable
> View: /dueuno/elements/core/PageContent]
> >
> > Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> > Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View:
> /dueuno/elements/core/PageContent]
> >
> > --
> > https://dueuno.com
> >
> >
> > On Wed, 24 Sept 2025 at 15:16, Gianluca Sartori <g....@gmail.com>
> wrote:
> >>
> >> As suggested, we tested building a JAR. The results are good enough for
> us to consider them production quality, although performance is still
> almost twice as slow on common use cases (small pages with few objects to
> render).
> >> Groovy INDY is set to OFF.
> >>
> >>
> >> Grails 6/Groovy 3
> >> =================
> >>
> >> Stress Test:
> >> TRANSITION rendered in 1564ms
> >> TRANSITION rendered in 1292ms
> >> TRANSITION rendered in 1249ms
> >> TRANSITION rendered in 1288ms
> >>
> >> Page 1:
> >> TRANSITION rendered in 32ms
> >>
> >> Page 2:
> >> TRANSITION rendered in 43ms
> >>
> >>
> >> Grails 7/Groovy 4
> >> =================
> >>
> >> Stress Test:
> >> TRANSITION rendered in 1607ms
> >> TRANSITION rendered in 1422ms
> >> TRANSITION rendered in 1444ms
> >> TRANSITION rendered in 1470ms
> >>
> >> Page 1:
> >> TRANSITION rendered in 64ms
> >>
> >> Page 2:
> >> TRANSITION rendered in 73ms
> >>
> >>
> >>
> >> Gianluca Sartori
> >> --
> >> https://dueuno.com
> >>
> >>
> >> On Mon, 22 Sept 2025 at 15:03, James Daugherty via dev <
> dev@grails.apache.org> wrote:
> >>>
> >>> Hi Gianluca,
> >>>
> >>> When you say debug mode, you are doing all of your performance testing
> with
> >>> debug mode? I would highly encourage you to test with runWar or runJar
> >>> without debug mode. Debug mode has historically always been
> significantly
> >>> slower.
> >>>
> >>> -James
> >>>
> >>> On Mon, Sep 22, 2025 at 4:30 AM Gianluca Sartori <g....@gmail.com>
> >>> wrote:
> >>>
> >>> > Hi David,
> >>> >
> >>> > Thank you for your reply, we've done the tests on the same code, the
> >>> > "only" difference is Grails 6 VS Grails 7. Tests are not in
> >>> > production, but locally from the IDE in debug mode. Yet grails 6 VS
> >>> > Grails 7 tests share the same environment.
> >>> >
> >>> > We have a hierarchy of objects to build any view, those objects go
> >>> > from a simple container to a Table that has a Body, a set of Rows,
> >>> > each row has many Cells each cell can have a Label or many other
> >>> > components.
> >>> >
> >>> > This hierarchy is rendered with GSP fragments (templates) so yes we
> >>> > may have a lot going on under a rendered Table. I know that most of
> >>> > the time is taken by the "layout engine" (?) because we've optimized
> >>> > the Table rendering just by limiting the number of components, thus
> >>> > embedding them instead of including them as separate templates.
> >>> >
> >>> > On the slowness, it is consistently slow but the warmup I've done was
> >>> > a couple of browser refreshes by hand just to compile the GSPs, I
> >>> > didn't go through a loop of 10.000 requests.
> >>> >
> >>> > About dynamically compiling GSP in production, we haven't specified
> >>> > anything in the standard 'application.yml' config, but my senses feel
> >>> > that even in production the first rendering takes longer I've always
> >>> > thought it was because of GSP compilation and it is not a problem to
> >>> > us.
> >>> >
> >>> >
> >>> > Gianluca Sartori
> >>> > --
> >>> > https://dueuno.com
> >>> >
> >>> > On Sun, 21 Sept 2025 at 17:18, David Estes <da...@gmail.com>
> wrote:
> >>> > >
> >>> > > A bit surprising . Is it consistently slower or just the first few
> >>> > times? Once it warms up it should still be ok for production no? Or
> are
> >>> > you dynamically compiling gsp in prod?
> >>> > >
> >>> > > I agree it should be further optimized , but dismissing it for
> initial
> >>> > performance seems aggressive. Unless it’s consistently significant on
> >>> > slowness .
> >>> > >
> >>> > > That being said those render times in general seem very high for
> most
> >>> > GSP I even render . Is there a large amount of taglib usage,
> layouts, etc?
> >>> > Narrowing down what might be causing overall slow page renders may
> be worth
> >>> > a gander. With those times I doubt it’s strictly GSP.
> >>> > >
> >>> > >
> >>> > > > On Sep 21, 2025, at 9:26 AM, Gianluca Sartori <
> g.sartori@gmail.com>
> >>> > wrote:
> >>> > > >
> >>> > > > I guess we need to find a solution refactoring GSP, rendering of
> >>> > pages must
> >>> > > > be as fast as possible.
> >>> > > >
> >>> > > > I will try to find time to give it a look but this means Grails
> 7 is
> >>> > out of
> >>> > > > scope for us at the moment.
> >>> > > >
> >>> > > > Unless we can run it with Groovy 3, i don’t like this, but if it
> >>> > solves the
> >>> > > > issue it would make it for us, do you think that would be
> possible?
> >>> > > >
> >>> > > > Should we switch to another templare solution? Which one would
> you
> >>> > suggest?
> >>> > > >
> >>> > > > Cheers,
> >>> > > >
> >>> > > > Gianluca Sartori
> >>> > > > --
> >>> > > > https://dueuno.com
> >>> > > >
> >>> > > >
> >>> > > > ---------- Forwarded message ---------
> >>> > > > From: Daniel Sun <su...@apache.org>
> >>> > > > Date: Sat, 20 Sep 2025 at 01:46
> >>> > > > Subject: Re: GSP generation, Groovy 4 slower than Groovy 3?
> >>> > > > To: <de...@groovy.apache.org>
> >>> > > >
> >>> > > >
> >>> > > > Hi Gianluca,
> >>> > > >
> >>> > > > Groovy 4 enables indy by default. It's slower to run for the
> first
> >>> > time
> >>> > > > because the initialization for invokedynamic is quite expensive.
> ( See
> >>> > > > also: https://bugs.openjdk.org/browse/JDK-8278540 )
> >>> > > >
> >>> > > > It ususally gains best performance when the methods are
> invoked for
> >>> > > > 10000+ times.
> >>> > > >
> >>> > > > BTW, Jochen proposed some optimization for current design of
> indy,
> >>> > the
> >>> > > > performance for the first runs will be much better when the
> >>> > optimization is
> >>> > > > done.
> >>> > > >
> >>> > > > Cheers,
> >>> > > > Daniel Sun
> >>> > > >
> >>> > > >> On 2025/09/16 12:18:41 Gianluca Sartori wrote:
> >>> > > >> Hi folks,
> >>> > > >>
> >>> > > >> we have started porting Dueuno to Grails 7/Groovy 4. We have a
> >>> > > >> stress-test that generates a big table (200 columns x 100 rows)
> with
> >>> > > >> GSP (we are doing server-side rendering).
> >>> > > >>
> >>> > > >> I'm reporting the tests below. Is there something we can do to
> get
> >>> > > >> back the performances we had with Grails 6/Groovy 3?
> >>> > > >>
> >>> > > >> Even with INDY turned off we are almost 1sec slower on the
> tests, more
> >>> > > >> than 2x slower on normal pages:
> >>> > > >>
> >>> > > >> Grails 7/Groovy 4
> >>> > > >> Page 1 - TRANSITION rendered in 185ms
> >>> > > >> Page 2 - TRANSITION rendered in 453ms
> >>> > > >>
> >>> > > >> Grails 6/Groovy 3
> >>> > > >> Page 1 - TRANSITION rendered in 83ms
> >>> > > >> Page 2 - TRANSITION rendered in 280ms
> >>> > > >>
> >>> > > >> TESTS
> >>> > > >> ======
> >>> > > >> Same URL (Table stress-test), 4 requests after 3 warmup
> requests (not
> >>> > > >> shown, cold-running the app from intelliJ), measuring the Grails
> >>> > > >> render() execution time.
> >>> > > >>
> >>> > > >> From slower to faster:
> >>> > > >>
> >>> > > >> Grails 7 - Indy ON
> >>> > > >> TRANSITION rendered in 4807ms
> >>> > > >> TRANSITION rendered in 4779ms
> >>> > > >> TRANSITION rendered in 4660ms
> >>> > > >> TRANSITION rendered in 4699ms
> >>> > > >>
> >>> > > >> Grails 7 - Indy OFF
> >>> > > >> tasks.withType(GroovyCompile) {
> >>> > > >> groovyOptions.optimizationOptions.indy = false
> >>> > > >> }
> >>> > > >> TRANSITION rendered in 3660ms
> >>> > > >> TRANSITION rendered in 3442ms
> >>> > > >> TRANSITION rendered in 3510ms
> >>> > > >> TRANSITION rendered in 3700ms
> >>> > > >>
> >>> > > >> Grails 6
> >>> > > >> TRANSITION rendered in 2853ms
> >>> > > >> TRANSITION rendered in 2864ms
> >>> > > >> TRANSITION rendered in 2734ms
> >>> > > >> TRANSITION rendered in 2800ms
> >>> > > >>
> >>> > > >> Gianluca Sartori
> >>> > > >> --
> >>> > > >> https://dueuno.com
> >>> > > >>
> >>> >
>
Re: GSP generation, Groovy 4 slower than Groovy 3?
Posted by James Daugherty <jd...@apache.org>.
That's great news! David is separately working on some further
performance improvements. We'll discuss further in the weekly
developer meeting.
Regards,
James
On Mon, Oct 6, 2025 at 9:51 AM Gianluca Sartori <g....@gmail.com> wrote:
>
> Hi James, David,
>
> I've run our tests with the latest Grails 7.0.0-SNAPSHOT as James suggested and things seem to have improved a lot.
> Still a tiny bit slowish, but I would say that now the results are comparable, also with INDY ON.
>
> That is great, thank you David, I feel better now :)
>
> Here they are:
> (Page 1 and Page 2 are different pages than those used in early tests so the absolute value is different than earlier)
> Grails 6/Groovy 3
> Table -> TRANSITION rendered in 1319ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1475ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1315ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1322ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
>
> Page 1 -> TRANSITION rendered in 20ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Page 2 -> TRANSITION rendered in 31ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
>
> Grails 7/Groovy 4 - INDY OFF
> Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1384ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1439ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1416ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
>
> Page 1 -> TRANSITION rendered in 26ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Page 2 -> TRANSITION rendered in 55ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
>
> Grails 7/Groovy 4 - INDY ON
> Table -> TRANSITION rendered in 1444ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1414ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1555ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Table -> TRANSITION rendered in 1559ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
>
> Page 1 -> TRANSITION rendered in 25ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
> Page 2 -> TRANSITION rendered in 59ms, args: [content:ContentTable View: /dueuno/elements/core/PageContent]
>
> --
> https://dueuno.com
>
>
> On Wed, 24 Sept 2025 at 15:16, Gianluca Sartori <g....@gmail.com> wrote:
>>
>> As suggested, we tested building a JAR. The results are good enough for us to consider them production quality, although performance is still almost twice as slow on common use cases (small pages with few objects to render).
>> Groovy INDY is set to OFF.
>>
>>
>> Grails 6/Groovy 3
>> =================
>>
>> Stress Test:
>> TRANSITION rendered in 1564ms
>> TRANSITION rendered in 1292ms
>> TRANSITION rendered in 1249ms
>> TRANSITION rendered in 1288ms
>>
>> Page 1:
>> TRANSITION rendered in 32ms
>>
>> Page 2:
>> TRANSITION rendered in 43ms
>>
>>
>> Grails 7/Groovy 4
>> =================
>>
>> Stress Test:
>> TRANSITION rendered in 1607ms
>> TRANSITION rendered in 1422ms
>> TRANSITION rendered in 1444ms
>> TRANSITION rendered in 1470ms
>>
>> Page 1:
>> TRANSITION rendered in 64ms
>>
>> Page 2:
>> TRANSITION rendered in 73ms
>>
>>
>>
>> Gianluca Sartori
>> --
>> https://dueuno.com
>>
>>
>> On Mon, 22 Sept 2025 at 15:03, James Daugherty via dev <de...@grails.apache.org> wrote:
>>>
>>> Hi Gianluca,
>>>
>>> When you say debug mode, you are doing all of your performance testing with
>>> debug mode? I would highly encourage you to test with runWar or runJar
>>> without debug mode. Debug mode has historically always been significantly
>>> slower.
>>>
>>> -James
>>>
>>> On Mon, Sep 22, 2025 at 4:30 AM Gianluca Sartori <g....@gmail.com>
>>> wrote:
>>>
>>> > Hi David,
>>> >
>>> > Thank you for your reply, we've done the tests on the same code, the
>>> > "only" difference is Grails 6 VS Grails 7. Tests are not in
>>> > production, but locally from the IDE in debug mode. Yet grails 6 VS
>>> > Grails 7 tests share the same environment.
>>> >
>>> > We have a hierarchy of objects to build any view, those objects go
>>> > from a simple container to a Table that has a Body, a set of Rows,
>>> > each row has many Cells each cell can have a Label or many other
>>> > components.
>>> >
>>> > This hierarchy is rendered with GSP fragments (templates) so yes we
>>> > may have a lot going on under a rendered Table. I know that most of
>>> > the time is taken by the "layout engine" (?) because we've optimized
>>> > the Table rendering just by limiting the number of components, thus
>>> > embedding them instead of including them as separate templates.
>>> >
>>> > On the slowness, it is consistently slow but the warmup I've done was
>>> > a couple of browser refreshes by hand just to compile the GSPs, I
>>> > didn't go through a loop of 10.000 requests.
>>> >
>>> > About dynamically compiling GSP in production, we haven't specified
>>> > anything in the standard 'application.yml' config, but my senses feel
>>> > that even in production the first rendering takes longer I've always
>>> > thought it was because of GSP compilation and it is not a problem to
>>> > us.
>>> >
>>> >
>>> > Gianluca Sartori
>>> > --
>>> > https://dueuno.com
>>> >
>>> > On Sun, 21 Sept 2025 at 17:18, David Estes <da...@gmail.com> wrote:
>>> > >
>>> > > A bit surprising . Is it consistently slower or just the first few
>>> > times? Once it warms up it should still be ok for production no? Or are
>>> > you dynamically compiling gsp in prod?
>>> > >
>>> > > I agree it should be further optimized , but dismissing it for initial
>>> > performance seems aggressive. Unless it’s consistently significant on
>>> > slowness .
>>> > >
>>> > > That being said those render times in general seem very high for most
>>> > GSP I even render . Is there a large amount of taglib usage, layouts, etc?
>>> > Narrowing down what might be causing overall slow page renders may be worth
>>> > a gander. With those times I doubt it’s strictly GSP.
>>> > >
>>> > >
>>> > > > On Sep 21, 2025, at 9:26 AM, Gianluca Sartori <g....@gmail.com>
>>> > wrote:
>>> > > >
>>> > > > I guess we need to find a solution refactoring GSP, rendering of
>>> > pages must
>>> > > > be as fast as possible.
>>> > > >
>>> > > > I will try to find time to give it a look but this means Grails 7 is
>>> > out of
>>> > > > scope for us at the moment.
>>> > > >
>>> > > > Unless we can run it with Groovy 3, i don’t like this, but if it
>>> > solves the
>>> > > > issue it would make it for us, do you think that would be possible?
>>> > > >
>>> > > > Should we switch to another templare solution? Which one would you
>>> > suggest?
>>> > > >
>>> > > > Cheers,
>>> > > >
>>> > > > Gianluca Sartori
>>> > > > --
>>> > > > https://dueuno.com
>>> > > >
>>> > > >
>>> > > > ---------- Forwarded message ---------
>>> > > > From: Daniel Sun <su...@apache.org>
>>> > > > Date: Sat, 20 Sep 2025 at 01:46
>>> > > > Subject: Re: GSP generation, Groovy 4 slower than Groovy 3?
>>> > > > To: <de...@groovy.apache.org>
>>> > > >
>>> > > >
>>> > > > Hi Gianluca,
>>> > > >
>>> > > > Groovy 4 enables indy by default. It's slower to run for the first
>>> > time
>>> > > > because the initialization for invokedynamic is quite expensive. ( See
>>> > > > also: https://bugs.openjdk.org/browse/JDK-8278540 )
>>> > > >
>>> > > > It ususally gains best performance when the methods are invoked for
>>> > > > 10000+ times.
>>> > > >
>>> > > > BTW, Jochen proposed some optimization for current design of indy,
>>> > the
>>> > > > performance for the first runs will be much better when the
>>> > optimization is
>>> > > > done.
>>> > > >
>>> > > > Cheers,
>>> > > > Daniel Sun
>>> > > >
>>> > > >> On 2025/09/16 12:18:41 Gianluca Sartori wrote:
>>> > > >> Hi folks,
>>> > > >>
>>> > > >> we have started porting Dueuno to Grails 7/Groovy 4. We have a
>>> > > >> stress-test that generates a big table (200 columns x 100 rows) with
>>> > > >> GSP (we are doing server-side rendering).
>>> > > >>
>>> > > >> I'm reporting the tests below. Is there something we can do to get
>>> > > >> back the performances we had with Grails 6/Groovy 3?
>>> > > >>
>>> > > >> Even with INDY turned off we are almost 1sec slower on the tests, more
>>> > > >> than 2x slower on normal pages:
>>> > > >>
>>> > > >> Grails 7/Groovy 4
>>> > > >> Page 1 - TRANSITION rendered in 185ms
>>> > > >> Page 2 - TRANSITION rendered in 453ms
>>> > > >>
>>> > > >> Grails 6/Groovy 3
>>> > > >> Page 1 - TRANSITION rendered in 83ms
>>> > > >> Page 2 - TRANSITION rendered in 280ms
>>> > > >>
>>> > > >> TESTS
>>> > > >> ======
>>> > > >> Same URL (Table stress-test), 4 requests after 3 warmup requests (not
>>> > > >> shown, cold-running the app from intelliJ), measuring the Grails
>>> > > >> render() execution time.
>>> > > >>
>>> > > >> From slower to faster:
>>> > > >>
>>> > > >> Grails 7 - Indy ON
>>> > > >> TRANSITION rendered in 4807ms
>>> > > >> TRANSITION rendered in 4779ms
>>> > > >> TRANSITION rendered in 4660ms
>>> > > >> TRANSITION rendered in 4699ms
>>> > > >>
>>> > > >> Grails 7 - Indy OFF
>>> > > >> tasks.withType(GroovyCompile) {
>>> > > >> groovyOptions.optimizationOptions.indy = false
>>> > > >> }
>>> > > >> TRANSITION rendered in 3660ms
>>> > > >> TRANSITION rendered in 3442ms
>>> > > >> TRANSITION rendered in 3510ms
>>> > > >> TRANSITION rendered in 3700ms
>>> > > >>
>>> > > >> Grails 6
>>> > > >> TRANSITION rendered in 2853ms
>>> > > >> TRANSITION rendered in 2864ms
>>> > > >> TRANSITION rendered in 2734ms
>>> > > >> TRANSITION rendered in 2800ms
>>> > > >>
>>> > > >> Gianluca Sartori
>>> > > >> --
>>> > > >> https://dueuno.com
>>> > > >>
>>> >