1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Share warmup logic across MJIT benchmarks

This commit is contained in:
Takashi Kokubun 2020-06-22 00:54:27 -07:00
parent faf93e4545
commit 4c5780e51e
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD
5 changed files with 38 additions and 30 deletions

View file

@ -0,0 +1,34 @@
require 'benchmark_driver/struct'
require 'benchmark_driver/metric'
require 'erb'
# A runner to measure after-JIT performance easily
class BenchmarkDriver::Runner::Mjit < BenchmarkDriver::Runner::Ips
# JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
Job = Class.new(BenchmarkDriver::DefaultJob)
# Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC]).extend(Module.new{
def parse(**)
jobs = super
jobs.map do |job|
job = job.dup
job.prelude = "#{job.prelude}\n#{<<~EOS}"
if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
__bmdv_ruby_i = 0
while __bmdv_ruby_i < 10000 # jit_min_calls
#{job.script}
__bmdv_ruby_i += 1
end
RubyVM::MJIT.pause # compile
#{job.script}
RubyVM::MJIT.resume; RubyVM::MJIT.pause # recompile
#{job.script}
RubyVM::MJIT.resume; RubyVM::MJIT.pause # recompile 2
end
EOS
job
end
end
})
end

View file

@ -1,3 +1,4 @@
type: lib/benchmark_driver/runner/mjit
prelude: |
class Bench < Hash
def initialize
@ -11,20 +12,6 @@ prelude: |
bench = Bench.new
if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
jit_min_calls = 10000
i = 0
while i < jit_min_calls
bench.exivar
i += 1
end
RubyVM::MJIT.pause # compile (1)
# issue recompile
bench.exivar
RubyVM::MJIT.resume
RubyVM::MJIT.pause # compile (2)
end
benchmark:
mjit_exivar: bench.exivar

View file

@ -1,3 +1,4 @@
type: lib/benchmark_driver/runner/mjit
prelude: |
def mjit_zero?(int)
int.zero?
@ -7,30 +8,14 @@ prelude: |
int == 0
end
def warmup(sym, int)
if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
jit_min_calls = 10000
i = 0
while i < jit_min_calls
send(sym, int)
i += 1
end
RubyVM::MJIT.pause
end
end
benchmark:
- name: 0.zero?
prelude: warmup(:mjit_zero?, 0)
script: mjit_zero?(0)
- name: 1.zero?
prelude: warmup(:mjit_zero?, 1)
script: mjit_zero?(1)
- name: 0 == 0
prelude: warmup(:mjit_eq_0, 0)
script: mjit_eq_0(0)
- name: 1 == 0
prelude: warmup(:mjit_eq_0, 1)
script: mjit_eq_0(1)
loop_count: 40000000

View file

@ -1,3 +1,4 @@
type: lib/benchmark_driver/runner/mjit
prelude: |
def leave
nil

View file

@ -1,3 +1,4 @@
type: lib/benchmark_driver/runner/mjit
prelude: |
def mjit_send_cfunc
self.class