[ 
https://issues.apache.org/jira/browse/GROOVY-9601?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17154036#comment-17154036
 ] 

Eric Milles commented on GROOVY-9601:
-------------------------------------

If I read the graph correctly, you are showing {{VariableScopeVisitor}} 
consuming roughly 8% of the total time.  It looks like quite a lot of that is 
spent spinning through the methods and calling 
{{MethodNodeUtils#getPropertyName}} on them.  I always wondered why methods 
were checked before properties.  That is one change that could be tried.

I think optimization of {{VariableScopeVisitor}} should be a separate ticket, 
because this ticket refers to moving from antlr2 to antlr4.  Improvements 
outside the parser will not help close the gap between the two.

> Parsing text into a class became much slower under Groovy 3.x
> -------------------------------------------------------------
>
>                 Key: GROOVY-9601
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9601
>             Project: Groovy
>          Issue Type: Bug
>          Components: class generator, Static compilation
>    Affects Versions: 3.0.4
>         Environment: Openjdk 11
>            Reporter: Fabian Depry
>            Priority: Major
>         Attachments: 50000.png, Groovy9601.groovy, 
> Groovy9601_CLASSGEN.groovy, Groovy9601_CLASSGEN.groovy, 
> Groovy9601_CLASSGEN_NO_STC.groovy, groovy9601.svg, 
> image-2020-06-25-17-42-31-315.png, no_tuning.png
>
>
> Our Java application needs to execute dynamically generated Groovy code and 
> we use the GroovyClassLoader to create a class from that generated code.
> When we tried to upgrade to Groovy 3.x we noticed a huge bump in the time it 
> takes to create those dynamic classes (it became 10 times slower for some of 
> them).
> Here is a very simple example of how we use the class loader:
> {code:java}
> package lab;
> import groovy.lang.GroovyClassLoader;
> public class GroovySpeedLab {
>     public static void main(String[] args) {
>         StringBuilder buf = new StringBuilder();
>         buf.append("package lab\r\n");
>         buf.append("\r\n");
>         buf.append("import groovy.transform.CompileStatic\r\n");
>         buf.append("\r\n");
>         buf.append("@CompileStatic\r\n");
>         buf.append("class MyClass {\r\n");
>         for (int i = 0; i < 1000; i++) {
>             buf.append("\r\n");
>             buf.append("    public void myMethod").append(i).append("() 
> {\r\n");
>             buf.append("        println('method ").append(i).append(" 
> invoked...')\r\n");
>             buf.append("    }\r\n");
>         }
>         buf.append("}\r\n");
>         long start = System.currentTimeMillis();
>         new GroovyClassLoader().parseClass(buf.toString());
>         System.out.println("Done parsing in " + (System.currentTimeMillis() - 
> start) + "ms");
>     }
> }
> {code}
> While this runs very quickly (because the methods are trivial), it it still 
> consistently 50% slower with 3.x (but I am including this example mainly to 
> show our use-case, not to focus on its speed difference).
> Our real application has much more complex classes (and many of them) and its 
> initialization went from a couple of minutes to 10+ minutes.
> Is there another way to parse a given Groovy class without taking such a big 
> performance hit with the new version of Groovy?
> Note that we also use many small Script objects created by calling 
> GroovyShell.parse() and we noticed the same performance hit for those (I 
> assume it uses the same mechanism under the hood).
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to