I am new to Openjdk and mlvm, but I have decades of experience in benchmark cheating and hackery. (No, that is not what I am bringing to OpenJDK.)
I went to look at Caliper, and in the tutorial, I saw this: return dummy; // framework ignores this, but it has served its purpose! This is not at all confidence-inspiring; inlining of the call, or even conditional inlining, allows the deadness of dummy to be detected, and then your benchmark is screwed. The framework should print dummy, to a real live file, not /dev/null (yes, once upon a time a workstation vendor spotted the /dev/null case and short-circuited all of libcurses out of the way). I wouldn't trust reflective access to be sufficiently obfuscating; if I used reflection and it could be optimized into a direct call, I would like that, so I should not be surprised if an optimizer picked up that transformation and it accidentally messed up this benchmark. Sorry if I seem skeptical, but I've seen intelligent people write terrible benchmarks. Consider the old JavaGrande Fork-Join benchmark: // do something trivial but which won't be optimised away! double theta=37.2, sint, res; sint = Math.sin(theta); res = sint*sint; //defeat dead code elimination if(res <= 0) System.out.println( "Benchmark exited with unrealistic res value " + res); Strictfp, Math.sin of theta is -0.478645918588415 -- that's straight from the spec, if you simply follow the recipe. Even with widefp, the optimizer knows the target FP, and constant propagate there, too. I think you can figure out the rest. Sorry if I seem skeptical, but you've got to be very careful with microbenchmarks. They say they're careful, but I looked at their examples, and by my standards, they're not careful enough. David On 2012-10-15, at 9:12 PM, Ashwin Jayaprakash <ashwin.jayaprak...@gmail.com> wrote: > People seem to be skeptical about the micro benchmarks I posted. This is why > I used Caliper (http://code.google.com/p/caliper/). > > Caliper runs each test multiple times (indicated by "trials"). Each trial > itself runs the code in a loop with "reps", which loops for 10s of millions > of times. So, I'm uploading the log files for your verification. Look for > statements like "running trial with 138668464 reps" in the files. Caliper > does run the test enough times to let the JIT warm up. > > JDK 8: > 0% Scenario{vm=java, trial=0, benchmark=Reflect, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 19.88 ns; ?=0.90 ns @ 10 trials > 10% Scenario{vm=java, trial=0, benchmark=Handle, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 16.06 ns; ?=0.09 ns @ 3 trials > 20% Scenario{vm=java, trial=0, benchmark=Direct, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 7.41 ns; ?=0.01 ns @ 3 trials > 30% Scenario{vm=java, trial=0, benchmark=Iface, tune=-server -Xmx96M -Xmx96M, > tier=-XX:+TieredCompilation} 7.27 ns; ?=0.06 ns @ 3 trials > 40% Scenario{vm=java, trial=0, benchmark=Static, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 7.33 ns; ?=0.01 ns @ 3 trials > 50% Scenario{vm=java, trial=0, benchmark=Reflect, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 18.55 ns; ?=1.88 ns @ 10 trials > 60% Scenario{vm=java, trial=0, benchmark=Handle, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 15.13 ns; ?=0.06 ns @ 3 trials > 70% Scenario{vm=java, trial=0, benchmark=Direct, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 7.21 ns; ?=0.07 ns @ 4 trials > 80% Scenario{vm=java, trial=0, benchmark=Iface, tune=-server -Xmx96M -Xmx96M, > tier=-XX:-TieredCompilation} 7.23 ns; ?=0.07 ns @ 9 trials > 90% Scenario{vm=java, trial=0, benchmark=Static, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 7.20 ns; ?=0.02 ns @ 3 trials > > benchmark tier ns linear runtime > Reflect -XX:+TieredCompilation 19.88 ============================== > Reflect -XX:-TieredCompilation 18.55 =========================== > Handle -XX:+TieredCompilation 16.06 ======================== > Handle -XX:-TieredCompilation 15.13 ====================== > Direct -XX:+TieredCompilation 7.41 =========== > Direct -XX:-TieredCompilation 7.21 ========== > Iface -XX:+TieredCompilation 7.27 ========== > Iface -XX:-TieredCompilation 7.23 ========== > Static -XX:+TieredCompilation 7.33 =========== > Static -XX:-TieredCompilation 7.20 ========== > > vm: java > trial: 0 > tune: -server -Xmx96M -Xmx96M > > Writing results to C:\temp\jdk_8_ea_b59.log > > > JDK 7: > 0% Scenario{vm=java, trial=0, benchmark=Reflect, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 16.40 ns; ?=0.16 ns @ 7 trials > 10% Scenario{vm=java, trial=0, benchmark=Handle, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 20.89 ns; ?=0.64 ns @ 10 trials > 20% Scenario{vm=java, trial=0, benchmark=Direct, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 4.81 ns; ?=0.04 ns @ 3 trials > 30% Scenario{vm=java, trial=0, benchmark=Iface, tune=-server -Xmx96M -Xmx96M, > tier=-XX:+TieredCompilation} 4.86 ns; ?=0.05 ns @ 3 trials > 40% Scenario{vm=java, trial=0, benchmark=Static, tune=-server -Xmx96M > -Xmx96M, tier=-XX:+TieredCompilation} 4.84 ns; ?=0.04 ns @ 3 trials > 50% Scenario{vm=java, trial=0, benchmark=Reflect, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 16.55 ns; ?=0.15 ns @ 4 trials > 60% Scenario{vm=java, trial=0, benchmark=Handle, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 20.96 ns; ?=0.59 ns @ 10 trials > 70% Scenario{vm=java, trial=0, benchmark=Direct, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 4.79 ns; ?=0.01 ns @ 3 trials > 80% Scenario{vm=java, trial=0, benchmark=Iface, tune=-server -Xmx96M -Xmx96M, > tier=-XX:-TieredCompilation} 4.80 ns; ?=0.03 ns @ 3 trials > 90% Scenario{vm=java, trial=0, benchmark=Static, tune=-server -Xmx96M > -Xmx96M, tier=-XX:-TieredCompilation} 4.85 ns; ?=0.05 ns @ 7 trials > > benchmark tier ns linear runtime > Reflect -XX:+TieredCompilation 16.40 ======================= > Reflect -XX:-TieredCompilation 16.55 ======================= > Handle -XX:+TieredCompilation 20.89 ============================= > Handle -XX:-TieredCompilation 20.96 ============================== > Direct -XX:+TieredCompilation 4.81 ====== > Direct -XX:-TieredCompilation 4.79 ====== > Iface -XX:+TieredCompilation 4.86 ====== > Iface -XX:-TieredCompilation 4.80 ====== > Static -XX:+TieredCompilation 4.84 ====== > Static -XX:-TieredCompilation 4.85 ====== > > vm: java > trial: 0 > tune: -server -Xmx96M -Xmx96M > > Writing results to C:\temp\jdk_7u7.log > > > Regards, > Ashwin. > > > > > <jdk_7u7.log><jdk_8_ea_b59.log>_______________________________________________ > 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