On Jun 15, 2011, at 5:26 PM, Rémi Forax wrote: > 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
How do I build this thing? -- Christian > > 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 _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev