Charlie, I found the root cause.
So, the problem is never-taken branches indeed.
The way how branch profiling for GWT (JDK-8063137 [1]) is performed
doesn't work well.
I hoped that profile collection and injection actions can be merged (
MHI.profileBoolean) into single action, but it's not the case. It means
that counter isn't updated when deopt event happens. For rarely taken
branches, it means that the method can be recompiled between 2 rare
events and the application will experience a series of
deopt/recompilation events.
I have to split MHI.propfileBoolean in 2 parts: MHI.attachProfile and
MHI.updateProfile.
MHI.attachProfile will be used as MHI.profileBoolean, but w/o updating
counts. Actual profiling will happen in MHI.updateProfile which will be
called on both branches. So, when deopt happens the very first thing it
does is bump the count.
The other problem is that deopt counts pollution can force GWT method to
be marked as non-compilable. It seems I should go back to explicit hint
for JIT to avoid method profiling (e.g. @DontProfile).
I'm working on the fix for both problems and will file a bug shortly.
Best regards,
Vladimir Ivanov
[1] https://bugs.openjdk.java.net/browse/JDK-8063137
On 2/26/15 9:18 PM, Vladimir Ivanov wrote:
Thanks for the report, Charlie!
The regression is caused by never-taken branch pruning [1].
-Djava.lang.invoke.MethodHandle.PROFILE_GWT=false makes the regression
go away.
My main suspicion is that recompilations caused by pruned branches can
lead to less efficient code. But I have to dig the logs before make any
conclusions.
I'll keep you posted about my findings.
Best regards,
Vladimir Ivanov
[1] https://bugs.openjdk.java.net/browse/JDK-8069591
On 2/26/15 2:53 AM, Charles Oliver Nutter wrote:
I'm finally at home with a working machine so I can follow up on some
VM Summit to-dos.
Vladimir wanted me to test out jdk9 hs-comp, which has all his latest
work on method handles. I wish I could report that performance looks
great, but it doesn't.
Here's timing (in s) of our red/black benchmark on JRuby 1.7.19, first
on the latest (as of today) 8u40 snapshot build and then on a
minutes-old jdk9 hs-comp build:
~/projects/jruby $ (pickjdk 4 ; rvm jruby-1.7.19 do ruby
-Xcompile.invokedynamic=true ../rubybench/time/bench_red_black.rb 10)
New JDK: jdk1.8.0_40.jdk
5.206
2.497
0.69
0.703
0.72
0.645
0.698
0.673
0.685
0.67
~/projects/jruby $ (pickjdk 5 ; rvm jruby-1.7.19 do ruby
-Xcompile.invokedynamic=true ../rubybench/time/bench_red_black.rb 10)
New JDK: jdk1.9_hs-comp
5.048
3.773
1.836
1.474
1.366
1.394
1.249
1.399
1.352
1.346
Perf is just about 2x slower on jdk9 hs-comp.
I tried out a few other benchmarks, which don't seem to have as much
variation:
* recursive fib(35): equal perf
* mandelbrot: jdk8u40 5% faster
* protobuf: jdk9 5% faster
The benchmarks are in jruby/rubybench on Github. JRuby 1.7.19 can be
grabbed from jruby.org or built from jruby/jruby (see BUILDING.md).
Looking forward to helping improve this :-)
- Charlie
_______________________________________________
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
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev