You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2017/02/01 23:19:02 UTC

[jira] [Closed] (GROOVY-8019) Strange performance issue using if(true) versus if(1==1)

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

Paul King closed GROOVY-8019.
-----------------------------

> Strange performance issue using if(true) versus if(1==1)
> --------------------------------------------------------
>
>                 Key: GROOVY-8019
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8019
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.4.4, 2.4.7
>         Environment: Groovy Script Engine in a Java app running on Windows 7 and Windows Server 2012
>            Reporter: Craig White
>            Assignee: Jochen Theodorou
>             Fix For: 2.4.8
>
>
> While using a Groovy script we came across a strange performance anomaly.  Having the bulk of our script wrapped in an  if( true ){}  statement as opposed to an  if( 1==1 ){}  statement severely degrades performance of the inner part of the script.  Multi-threaded performance is most severely affected.  There appeared to be much more contention running the same script on a 48 core box with the  "if(true)".  (took about 100x longer to run 48 copies of these scripts on their own threads). 
> The curious aspect of this, is that the 'if' statement is not in the nested loops, but somehow has negatively affected the compilation / optimization / byte-code.
> Running a Single copy of this script on a 8 core i7 shows quite a performance hit too...  (5000ms vs. 200ms)
> The (effective) code to run the script is as follows...
> {code}
> 	compiledScript = ((Compilable)engine).compile(scriptString);
> 	result = compiledScript.eval(bindings);
> {code}
> Here's the script...
> {code}
> // $script_engine_name=groovy
> long sum = 0;
> double m = 1;
> if( true ) {
> 	System.err.println( "START");
> 	long t0 = System.currentTimeMillis();
> 	for( int j=0; j<1000; j++ ) {
> 	  for( int i=0; i<100000; i++ ) {
>   		sum = sum + i;
>   		m = m*i;
> 	  }
> 	}
> 	long t1 = System.currentTimeMillis();
> 	System.err.println( "END - " + (t1-t0)+"ms");
> }
> System.err.println( "Done: "+sum+" "+m );
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)