Share warmup logic across MJIT benchmarks
This commit is contained in:
parent
faf93e4545
commit
4c5780e51e
34
benchmark/lib/benchmark_driver/runner/mjit.rb
Normal file
34
benchmark/lib/benchmark_driver/runner/mjit.rb
Normal 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
|
@ -1,3 +1,4 @@
|
|||||||
|
type: lib/benchmark_driver/runner/mjit
|
||||||
prelude: |
|
prelude: |
|
||||||
class Bench < Hash
|
class Bench < Hash
|
||||||
def initialize
|
def initialize
|
||||||
@ -11,20 +12,6 @@ prelude: |
|
|||||||
|
|
||||||
bench = Bench.new
|
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:
|
benchmark:
|
||||||
mjit_exivar: bench.exivar
|
mjit_exivar: bench.exivar
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
type: lib/benchmark_driver/runner/mjit
|
||||||
prelude: |
|
prelude: |
|
||||||
def mjit_zero?(int)
|
def mjit_zero?(int)
|
||||||
int.zero?
|
int.zero?
|
||||||
@ -7,30 +8,14 @@ prelude: |
|
|||||||
int == 0
|
int == 0
|
||||||
end
|
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:
|
benchmark:
|
||||||
- name: 0.zero?
|
- name: 0.zero?
|
||||||
prelude: warmup(:mjit_zero?, 0)
|
|
||||||
script: mjit_zero?(0)
|
script: mjit_zero?(0)
|
||||||
- name: 1.zero?
|
- name: 1.zero?
|
||||||
prelude: warmup(:mjit_zero?, 1)
|
|
||||||
script: mjit_zero?(1)
|
script: mjit_zero?(1)
|
||||||
- name: 0 == 0
|
- name: 0 == 0
|
||||||
prelude: warmup(:mjit_eq_0, 0)
|
|
||||||
script: mjit_eq_0(0)
|
script: mjit_eq_0(0)
|
||||||
- name: 1 == 0
|
- name: 1 == 0
|
||||||
prelude: warmup(:mjit_eq_0, 1)
|
|
||||||
script: mjit_eq_0(1)
|
script: mjit_eq_0(1)
|
||||||
|
|
||||||
loop_count: 40000000
|
loop_count: 40000000
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
type: lib/benchmark_driver/runner/mjit
|
||||||
prelude: |
|
prelude: |
|
||||||
def leave
|
def leave
|
||||||
nil
|
nil
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
type: lib/benchmark_driver/runner/mjit
|
||||||
prelude: |
|
prelude: |
|
||||||
def mjit_send_cfunc
|
def mjit_send_cfunc
|
||||||
self.class
|
self.class
|
||||||
|
Loading…
x
Reference in New Issue
Block a user