diff options
author | Takashi Kokubun <[email protected]> | 2020-06-22 00:54:27 -0700 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2020-06-22 00:54:27 -0700 |
commit | 4c5780e51ef1cd122c6cff863657bd7c523d65ec (patch) | |
tree | 031f7e660e9684c02dea19e5a18de7c98ebc6b71 | |
parent | faf93e45459793870346f17472a30f90c9b2f5b7 (diff) |
Share warmup logic across MJIT benchmarks
-rw-r--r-- | benchmark/lib/benchmark_driver/runner/mjit.rb | 34 | ||||
-rw-r--r-- | benchmark/mjit_exivar.yml | 15 | ||||
-rw-r--r-- | benchmark/mjit_int_zero_p.yml | 17 | ||||
-rw-r--r-- | benchmark/mjit_leave.yml | 1 | ||||
-rw-r--r-- | benchmark/mjit_send_cfunc.yml | 1 |
5 files changed, 38 insertions, 30 deletions
diff --git a/benchmark/lib/benchmark_driver/runner/mjit.rb b/benchmark/lib/benchmark_driver/runner/mjit.rb new file mode 100644 index 0000000000..1d4693e8be --- /dev/null +++ b/benchmark/lib/benchmark_driver/runner/mjit.rb @@ -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 diff --git a/benchmark/mjit_exivar.yml b/benchmark/mjit_exivar.yml index e6fbae96de..2584fa6410 100644 --- a/benchmark/mjit_exivar.yml +++ b/benchmark/mjit_exivar.yml @@ -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 diff --git a/benchmark/mjit_int_zero_p.yml b/benchmark/mjit_int_zero_p.yml index 91e8ea0102..f8950bad2e 100644 --- a/benchmark/mjit_int_zero_p.yml +++ b/benchmark/mjit_int_zero_p.yml @@ -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 diff --git a/benchmark/mjit_leave.yml b/benchmark/mjit_leave.yml index 292d6ef041..9ac68b164b 100644 --- a/benchmark/mjit_leave.yml +++ b/benchmark/mjit_leave.yml @@ -1,3 +1,4 @@ +type: lib/benchmark_driver/runner/mjit prelude: | def leave nil diff --git a/benchmark/mjit_send_cfunc.yml b/benchmark/mjit_send_cfunc.yml index b5f9c897ec..8caa62ce81 100644 --- a/benchmark/mjit_send_cfunc.yml +++ b/benchmark/mjit_send_cfunc.yml @@ -1,3 +1,4 @@ +type: lib/benchmark_driver/runner/mjit prelude: | def mjit_send_cfunc self.class |