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

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

The original post mentions that the sample is not a direct example of the 
performance difference, but a way to show what they are doing in their larger 
system.  I think it is important to try to understand these issues beyond micro 
benchmarks.

[~daniel_sun] What issue are you raising about static compilation?  I can't get 
a good grasp from the posts.  Is there a direct comparison between Groovy 2.5 
and Groovy 3 or standard vs static compilation?

It would be nice to have some profiler results so we can target a specific part 
of the compiler.  The parser is one thing you can switch back to the old 
parser, to get an idea about the cost of that one subsystem with all other 
parts held constant.

> 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_NO_STC.groovy, 
> 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