wacky micro-benchmark

Kirk kirk.pepperdine at gmail.com
Tue Feb 12 00:45:18 PST 2008

I should have added that this is the JDK 1.6.0_04-b12 running on Windows 
XP, plenty of RAM and no garbage.

Kirk Pepperdine wrote:
> I've been fiddling with the loop invariant hoisting optimization 
> trying to demonstrate how it works. In my first iteration I used a 
> long to sum up the invariant in a loop. First run with -Xint showed 
> 7.6 seconds for the hoisted version and 15.4 for the non-hoisted 
> version. Pretty much as one would predict. Running with -client I see 
> 3.5 seconds for hoisted and 6.3 for non-hoisted. A bit of surprise 
> because I figured the client would hoist the invariant but it appears 
> not to have. Then things got weird when I ran with -server. The 
> hoisted code ran in 6.3 seconds and non hoisted in 6.4. Now, I 
> expected the values to be about the same but not towards the slower 
> end of the spectrum.
> I of course immediately suspected that the benchmark is bad as that is 
> usually is the case more often than not. However after lots of fiddles 
> (checking for mono/poly morphic optimizations... etc) I was unable to 
> get a different result which now leaves me wondering, is there 
> something with long in loop invariants that results in a slower 
> optimization than expected? And why would the client compiler not 
> hoist the invariant.
> One of the fiddles was to change the longs to ints. The server 
> compiler ran in (hoisted) 46ms and (non-hoisted) 47ms respectively. 
> Difficult to say without further testing if they are really the same. 
> Client testing was 1188ms and 1297ms respectively. Again difficult to 
> say without further testing if these are the same. For completeness 
> the -Xint values are 99.2s and 126.5s.
> It was very nice to see that without having any return value, the 
> -server compiler identified the methods as dead and replaced the call 
> with a noop.
> So, does anyone have any comments (including you are a moron for 
> attempting this ;-)) on why the long invariant hoisting bench appears 
> to be broken.
> -- 
> Kind regards,
> Kirk Pepperdine
> http://www.kodewerk.com
> http://www.javaperformancetuning.com
> http//www.cretesoft.com
>     public int hoist( int a, int b) {
>         int total = Integer.MIN_VALUE;
>         int hoisted = a + b;
>         for ( int i = 0; i < LOOP_COUNT; i++)
>             total += hoisted;
>         return total;
>     }
>     public int nonHoist( int a, int b) {
>         int total = Integer.MIN_VALUE;
>         for ( int i = 0; i < LOOP_COUNT; i++)
>             total += (a + b);
>         return total;
>     }

More information about the hotspot-dev mailing list