diff options
author | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-05-07 16:16:59 +0000 |
---|---|---|
committer | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-05-07 16:16:59 +0000 |
commit | 6c62356e5a7a48aea74b06573ba56c5c3e333d80 (patch) | |
tree | b8c1ffaa5dde2e42c713ea45731f3f7aedd78220 /test | |
parent | a4a66510fb90ae9e94992dc1f547f3dc1626fb6a (diff) | |
download | ruby-6c62356e5a7a48aea74b06573ba56c5c3e333d80.tar.gz |
_mjit_compile_send.erb: inline recursive call
mjit_compile.c: propagate funcname to compile_insn
test_jit.rb: add test covering this behavior
* Benchmark
```
require 'benchmark_driver'
Benchmark.driver(runner: :time, repeat_count: 4) do |x|
x.prelude %{
def fib(x)
return x if x == 0 || x == 1
fib(x-1) + fib(x-2)
end
}
x.report 'fib(40)'
x.loop_count 1
x.rbenv(
'before,--jit',
'before',
'after,--jit',
'after',
)
x.verbose
end
```
```
before,--jit: ruby 2.6.0dev (2018-05-08 trunk 63349) +JIT [x86_64-linux]
before: ruby 2.6.0dev (2018-05-08 trunk 63349) [x86_64-linux]
after,--jit: ruby 2.6.0dev (2018-05-08 trunk 63349) +JIT [x86_64-linux]
last_commit=_mjit_compile_send.erb: inline recursive call
after: ruby 2.6.0dev (2018-05-08 trunk 63349) [x86_64-linux]
last_commit=_mjit_compile_send.erb: inline recursive call
Calculating -------------------------------------
before,--jit before after,--jit after
fib(40) 2.886 8.685 2.562 8.800 s - 1.000 times
Comparison:
fib(40)
after,--jit: 2.6 s
before,--jit: 2.9 s - 1.13x slower
before: 8.7 s - 3.39x slower
after: 8.8 s - 3.44x slower
```
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63350 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r-- | test/ruby/test_jit.rb | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/test/ruby/test_jit.rb b/test/ruby/test_jit.rb index 891b7f496f..844f36a98f 100644 --- a/test/ruby/test_jit.rb +++ b/test/ruby/test_jit.rb @@ -322,6 +322,16 @@ class TestJIT < Test::Unit::TestCase def test_compile_insn_opt_send_without_block assert_compile_once('print', result_inspect: 'nil', insns: %i[opt_send_without_block]) + + # recursive inline + assert_eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", stdout: '120', success_count: 1, min_calls: 2) + begin; + def fact(i) + return i if i <= 1 + i * fact(i - 1) + end + print fact(5) + end; end def test_compile_insn_invokesuper |