HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: //usr/local/rvm/src/ruby-3.0.2/benchmark/lib/benchmark_driver/runner/mjit.rb
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