On 01/07/2015 10:43 AM, Marcus Lagergren wrote:
Remi, I tried to reproduce your problem with jdk9 b44. It runs decently fast.
yes, nashorn is fast enough but it can be faster if the JIT was not
doing something stupid.
When the VM inline fibo, because fibo is recursive, the recursive call
is inlined only once,
so the call at depth=2 can not be inlined but should be a classical
direct call.
But if fibo is called through an invokedynamic, instead of emitting a
direct call to fibo,
the JIT generates a code that push the method handle on stack and execute it
like if the metod handle was not constant
(the method handle is constant because the call at depth=1 is inlined !).
When did it start to regress?
jdk7u40, i believe.
I've created a jar containing some handwritten bytecodes with no
dependency to reproduce the issue easily:
https://github.com/forax/vmboiler/blob/master/test7/fibo7.jar
[forax@localhost test7]$ time /usr/jdk/jdk1.9.0/bin/java -cp fibo7.jar
FiboSample
1836311903
real 0m6.653s
user 0m6.729s
sys 0m0.019s
[forax@localhost test7]$ time /usr/jdk/jdk1.8.0_25/bin/java -cp
fibo7.jar FiboSample
1836311903
real 0m6.572s
user 0m6.591s
sys 0m0.019s
[forax@localhost test7]$ time /usr/jdk/jdk1.7.0_71/bin/java -cp
fibo7.jar FiboSample
1836311903
real 0m6.373s
user 0m6.396s
sys 0m0.016s
[forax@localhost test7]$ time /usr/jdk/jdk1.7.0_25/bin/java -cp
fibo7.jar FiboSample
1836311903
real 0m4.847s
user 0m4.832s
sys 0m0.019s
as you can see, it was faster with a JDK before jdk7u40.
Regards
Marcus
cheers,
Rémi
On 30 Dec 2014, at 20:48, Remi Forax <fo...@univ-mlv.fr> wrote:
Hi guys,
I've found a bug in the interaction between the lambda form and inlining
algorithm,
basically if the inlining heuristic bailout because the method is recursive and
already inlined once,
instead to emit a code to do a direct call, it revert to do call to linkStatic
with the method
as MemberName.
I think it's a regression because before the introduction of lambda forms,
I'm pretty sure that the JIT was emitting a direct call.
Step to reproduce with nashorn, run this JavaScript code
function fibo(n) {
return (n < 2)? 1: fibo(n - 1) + fibo(n - 2)
}
print(fibo(45))
like this:
/usr/jdk/jdk1.9.0/bin/jjs -J-XX:+UnlockDiagnosticVMOptions -J-XX:+PrintAssembly
fibo.js > log.txt
look for a method 'fibo' from the tail of the log, you will find something like
this:
0x00007f97e4b4743f: mov $0x76d08f770,%r8 ; {oop(a
'java/lang/invoke/MemberName' = {method} {0x00007f97dcff8e40} 'fibo'
'(Ljdk/nashorn/internal/runtime/ScriptFunction;Ljava/lang/Object;I)I' in
'jdk/nashorn/internal/scripts/Script$Recompilation$2$fibo')}
0x00007f97e4b47449: xchg %ax,%ax
0x00007f97e4b4744b: callq 0x00007f97dd0446e0
I hope this can be fixed. My demonstration that I can have fibo written with a
dynamic language
that run as fast as written in Java doesn't work anymore :(
cheers,
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
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev