I've just finished to code a sample for the cookbook that does
integer operation (+ and -) with overflow (to BigInteger).

https://code.google.com/p/jsr292-cookbook/source/browse/#svn%2Ftrunk%2Fbinary-operation%2Fsrc%2Fjsr292%2Fcookbook%2Fbinop

For a code like this one:
max = ...
for(i=0; i<max; i = i + 1) {
   // do nothing
}

i + 1 is transformed to:

if (i.getClass() == Integer.class) {
   int j = i.intValue();
   if (j != MAXINT) {
     i = Integer.valueOf(j + 1);
   } else {
      fallback();
   }
} else {
   fallback();
}

but there is a bad news, perf of  i + 1 considering 1 as a constant
are *worst* (2 or 3 times !!) that using the double xor trick.

// with the optimization
[forax@localhost binary-operation]$ time java -cp .:classes PerfOpt
real    0m0.954s
user    0m1.030s
sys    0m0.087s

// without
[forax@localhost binary-operation]$ time java -cp .:classes Perf
real    0m0.378s
user    0m0.407s
sys    0m0.081s

Knowing that the double xor trick does 4 comparisons and
the constant trick only two, the problem comes from either
my code or the way the VM inlines the method handles.

I've found no problem in my code so ... :)
Playing with the VM logs, the method containing (j != MAXINT) is not inlined
because it hits the maximum depth (as far as I remember this problem
is new, the older algorithm, the one that didn't propagate MDO, didn't 
exhibit this problem).
Moreover, the VM tries to inline some parts of the fallback method 
(twice :( )
even if this code never called.

The way the VM decides to inline method handles in this case is not good 
at all.

Rémi

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to