aboutsummaryrefslogtreecommitdiffstats
path: root/benchmark
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-06-22 00:54:27 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2020-06-22 00:54:27 -0700
commit4c5780e51ef1cd122c6cff863657bd7c523d65ec (patch)
tree031f7e660e9684c02dea19e5a18de7c98ebc6b71 /benchmark
parentfaf93e45459793870346f17472a30f90c9b2f5b7 (diff)
downloadruby-4c5780e51ef1cd122c6cff863657bd7c523d65ec.tar.gz
Share warmup logic across MJIT benchmarks
Diffstat (limited to 'benchmark')
-rw-r--r--benchmark/lib/benchmark_driver/runner/mjit.rb34
-rw-r--r--benchmark/mjit_exivar.yml15
-rw-r--r--benchmark/mjit_int_zero_p.yml17
-rw-r--r--benchmark/mjit_leave.yml1
-rw-r--r--benchmark/mjit_send_cfunc.yml1
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