You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@groovy.apache.org by Stephen Mallette <sp...@gmail.com> on 2021/01/08 19:45:59 UTC

Re: groovysh and long input

hello, I've added some additional analysis to the issue I'd created several
months back regarding the performance issues I've been seeing with what I
will now term "incomplete multi-line scripts":

https://issues.apache.org/jira/browse/GROOVY-9785

I think the notion of "incomplete" is the key aspect of this issue and why
Daniel Sun's attempt to recreate the problem with a script in this thread
did not demonstrate a deficiency. I've revised that script and it now
demonstrates the issue as I've been seeing. You may find it attached to the
JIRA issue.

Unfortunately, this is a major issue for Apache TinkerPop and a blocker to
our next major release (though we are not rushed as of yet). I know parts
of the groovy code base, but the parser and antlr level code is quite
unfamiliar to me so I don't immediately see a simple surgical fix. Does
anyone have any guidance?



On Tue, Oct 20, 2020 at 7:09 AM Stephen Mallette <sp...@gmail.com>
wrote:

> I've created:
>
> https://issues.apache.org/jira/browse/GROOVY-9785
>
>
>
> On Tue, Oct 20, 2020 at 6:40 AM Paul King <pa...@asert.com.au> wrote:
>
>> Hi Stephen, sounds like it can't hurt.
>>
>> Cheers, Paul.
>>
>>
>> On Tue, Oct 20, 2020 at 8:23 PM Stephen Mallette <sp...@gmail.com>
>> wrote:
>>
>>> Would it help if I created a ticket in JIRA and uploaded the JFRs I had?
>>> Perhaps someone could take a look and either see an easy fix or point me in
>>> the right direction toward one?
>>>
>>> On Mon, Oct 19, 2020 at 7:43 PM Daniel Sun <su...@apache.org> wrote:
>>>
>>>>
>>>> I think the performance issue could be related to groovysh but not the
>>>> new parser.
>>>> Here the result of running my script[1], as you could see, it works
>>>> well:
>>>> ```
>>>> D:\_TEMP\yyy>groovy Test.groovy
>>>> result: 5500; elapsed time: 261ms
>>>>
>>>> D:\_TEMP\yyy>groovy Test.groovy
>>>> result: 5500; elapsed time: 240ms
>>>>
>>>> D:\_TEMP\yyy>groovy Test.groovy
>>>> result: 5500; elapsed time: 275ms
>>>>
>>>> D:\_TEMP\yyy>groovy Test.groovy
>>>> result: 5500; elapsed time: 249ms
>>>>
>>>> D:\_TEMP\yyy>groovy Test.groovy
>>>> result: 5500; elapsed time: 259ms
>>>>
>>>> D:\_TEMP\yyy>groovy -v
>>>> Groovy Version: 3.0.6 JVM: 15 Vendor: Azul Systems, Inc. OS: Windows 10
>>>> ```
>>>>
>>>> Cheers,
>>>> Daniel Sun
>>>>
>>>> [1] my script:
>>>> ```
>>>> def begin = System.currentTimeMillis()
>>>>
>>>> // 500 lines of "1 + 10 +"
>>>> def result = new GroovyShell().evaluate '''
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10 +
>>>> 1 + 10
>>>> '''
>>>>
>>>> def end = System.currentTimeMillis()
>>>>
>>>> println "result: $result; elapsed time: ${end - begin}ms"
>>>>
>>>> ```
>>>>
>>>>
>>>> On 2020/10/19 11:06:25, Stephen Mallette <sp...@gmail.com> wrote:
>>>> > I was using 3.0.6 actually (I'd downloaded it to make sure that it
>>>> wasn't
>>>> > our extension of groovysh that was causing some difference). But to be
>>>> > sure, I just retested it on 3.0.6 and 2.5.13. I built a 500 line
>>>> script of
>>>> > "addition". For 2.5.13 I got:
>>>> >
>>>> > groovy:000> start = System.currentTimeMillis()
>>>> > ===> 1603105239050
>>>> > groovy:000> 1 + 10 +
>>>> > groovy:001> 1 + 10 +
>>>> > groovy:002> 1 + 10 +
>>>> > groovy:003> 1 + 10 +
>>>> > groovy:004> 1 + 10 +
>>>> > groovy:005> 1 + 10 +
>>>> > groovy:006> 1 + 10 +
>>>> > ...
>>>> > groovy:495> 1 + 10 +
>>>> > groovy:496> 1 + 10 +
>>>> > groovy:497> 1 + 10
>>>> > ===> 5478
>>>> > groovy:000> System.currentTimeMillis() - start
>>>> > ===> 1193
>>>> >
>>>> > and on 3.0.6 I got:
>>>> >
>>>> > groovy:000> start = System.currentTimeMillis()
>>>> > ===> 1603105244825
>>>> > groovy:000> 1 + 10 +
>>>> > groovy:001> 1 + 10 +
>>>> > groovy:002> 1 + 10 +
>>>> > groovy:003> 1 + 10 +
>>>> > groovy:004> 1 + 10 +
>>>> > groovy:005> 1 + 10 +
>>>> > groovy:006> 1 + 10 +
>>>> > ...
>>>> > groovy:495> 1 + 10 +
>>>> > groovy:496> 1 + 10 +
>>>> > groovy:497> 1 + 10
>>>> > ===> 5478
>>>> > groovy:000> System.currentTimeMillis() - start
>>>> > ===> 31876
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> > On Mon, Oct 19, 2020 at 6:40 AM Daniel Sun <su...@apache.org> wrote:
>>>> >
>>>> > >
>>>> > > Please try 3.0.6+, we have tuned the performance a lot.
>>>> > >
>>>> > > Cheers,
>>>> > > Daniel Sun
>>>> > > On 2020/10/16 18:58:28, Stephen Mallette <sp...@gmail.com>
>>>> wrote:
>>>> > > > Hello,
>>>> > > >
>>>> > > > I happened to be testing some issues related to this pull request
>>>> I
>>>> > > > submitted the other day:
>>>> > > >
>>>> > > > https://github.com/apache/groovy/pull/1405
>>>> > > >
>>>> > > > In testing between groovy 2.5.x and 3.x I've noticed a
>>>> considerable
>>>> > > > performance difference when pasting long multi-lined scripts.
>>>> 2.5.x is
>>>> > > > quite quick to accept the input whereas 3.x seems to slow more
>>>> and more
>>>> > > as
>>>> > > > additional lines are consumed. While I did more complex tests
>>>> trying to
>>>> > > get
>>>> > > > to the bottom of the problem, it's fairly easy to recreate with a
>>>> simple
>>>> > > > addition script:
>>>> > > >
>>>> > > > 1 + 10 +
>>>> > > > 1 + 10 +
>>>> > > > 1 + 10 +
>>>> > > > 1 + 10 +
>>>> > > > 1 + 10 +
>>>> > > > ... repeated a bunch of times and then ended with
>>>> > > > 1
>>>> > > >
>>>> > > > copy that out of your text editor and just paste it into both
>>>> versions of
>>>> > > > groovsh and see the difference. I've found 500 lines demonstrates
>>>> it well
>>>> > > > but you could probably get away with less and still see the
>>>> difference of
>>>> > > > evaluation at play.
>>>> > > >
>>>> > > > I tried to do some profiling to try to isolate the problem
>>>> myself, but
>>>> > > > things got a little too deep into antlr4 for me and I got lost.
>>>> Does
>>>> > > anyone
>>>> > > > have any ideas as to what might be different for 3.x?
>>>> > > >
>>>> > >
>>>> >
>>>>
>>>