[ 
https://issues.apache.org/jira/browse/GROOVY-11842?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jochen Theodorou updated GROOVY-11842:
--------------------------------------
    Description: 
As can be seen in the IndyInterfaceUsageTest there is a stack trace element 
showing IndyInterface.  This is bad for inlining and general performance.

  !improved_indy.svg!

of course a programm like 
{code:Java}
  int foo(){1}
  int a
  for (int i=0; i<MAX; i++) {
   a = foo()
  }
{code}
is not much of a test for anything. It was supposed to show better inlining, 
but unlike Groovy 3 all later Groovy version fail to unroll the loop and 
eliminate the assignment to a for later executions. The graph though shows that 
the branch performance is better than Groov 3 or 4. Not only in the long run, 
but also on start. But be aware the graph above is from the 5th iteration of 1k 
calls to be able to see things more in scale. The first 4 iterations of 1k 
calls look like this:

 !improved_indy_startup.svg! 

to actually be able to see differences the iteration size is now 100 calls and 
the y-axis is logarithmic. I want to especially point out how the no-primopts 
variant has similar initial cost as indy. 

  was:
As can be seen in the IndyInterfaceUsageTest there is a stack trace element 
showing IndyInterface.  This is bad for inlining and general performance.

  !improved_indy.svg!

of course a programm like 
{code:Java}
  int foo(){1}
  int a
  for (int i=0; i<MAX; i++) {
   a = foo()
  }
{code}
is not much of a test for anything. It was supposed to show better inlining, 
but unlike Groovy 3 all later Groovy version fail to unroll the loop and 
eliminate the assignment to a for later executions. The graph though shows that 
the branch performance is better than Groov 3 or 4. Not only in the long run, 
but also on start. But be aware the graph above is from the 5th iteration of 1k 
calls to be able to see things more in scale. The first 4 iterations of 1k 
calls look like this:

 !improved_indy_startup.svg! 

to actually be able to see differences the iteration size is now 100 calls and 
the y-axis is logarithmic. I want to especially point out how the no-primopts 
variant has similar initial cost as indy. But also the the experimental branch 
has a lower startup cost


> Invokedynamic first invocation should not have a line with IndyInterface
> ------------------------------------------------------------------------
>
>                 Key: GROOVY-11842
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11842
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Jochen Theodorou
>            Priority: Major
>         Attachments: improved_indy.svg, improved_indy_startup.svg, 
> screenshot-1.png
>
>
> As can be seen in the IndyInterfaceUsageTest there is a stack trace element 
> showing IndyInterface.  This is bad for inlining and general performance.
>   !improved_indy.svg!
> of course a programm like 
> {code:Java}
>   int foo(){1}
>   int a
>   for (int i=0; i<MAX; i++) {
>    a = foo()
>   }
> {code}
> is not much of a test for anything. It was supposed to show better inlining, 
> but unlike Groovy 3 all later Groovy version fail to unroll the loop and 
> eliminate the assignment to a for later executions. The graph though shows 
> that the branch performance is better than Groov 3 or 4. Not only in the long 
> run, but also on start. But be aware the graph above is from the 5th 
> iteration of 1k calls to be able to see things more in scale. The first 4 
> iterations of 1k calls look like this:
>  !improved_indy_startup.svg! 
> to actually be able to see differences the iteration size is now 100 calls 
> and the y-axis is logarithmic. I want to especially point out how the 
> no-primopts variant has similar initial cost as indy. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to