File: mjit.rb

package info (click to toggle)
ruby3.1 3.1.2-7%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 132,892 kB
  • sloc: ruby: 1,154,753; ansic: 736,782; yacc: 46,445; pascal: 10,401; sh: 3,931; cpp: 1,158; python: 838; makefile: 787; asm: 462; javascript: 382; lisp: 97; sed: 94; perl: 62; awk: 36; xml: 4
file content (34 lines) | stat: -rw-r--r-- 1,150 bytes parent folder | download
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::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