summaryrefslogtreecommitdiff
path: root/benchmark/lib/benchmark_driver/runner/mjit.rb
blob: abefa463b3081d92f8dd82bf40c36ff818ca4f70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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::JIT) && RubyVM::JIT.enabled?
            __bmdv_ruby_i = 0
            while __bmdv_ruby_i < 10000 # jit_min_calls
              #{job.script}
              __bmdv_ruby_i += 1
            end
            RubyVM::JIT.pause # compile
            #{job.script}
            RubyVM::JIT.resume; RubyVM::JIT.pause # recompile
            #{job.script}
            RubyVM::JIT.resume; RubyVM::JIT.pause # recompile 2
          end
        EOS
        job
      end
    end
  })
end