This module allows for introspection of YJIT, CRuby’s just-in-time compiler. Everything in the module is highly implementation specific and the API might be less stable compared to the standard library.
This module may not exist if YJIT does not support the particular platform for which CRuby is built.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 253
def self.code_gc
Primitive.rb_yjit_code_gc
end
Discard existing compiled code to reclaim memory and allow for recompilations in the future.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 176
def self.dump_exit_locations(filename)
unless trace_exit_locations_enabled?
raise ArgumentError, "--yjit-trace-exits must be enabled to use dump_exit_locations."
end
File.binwrite(filename, Marshal.dump(RubyVM::YJIT.exit_locations))
end
Marshal dumps exit locations to the given filename.
Usage:
If --yjit-exit-locations is passed, a file named “yjit_exit_locations.dump” will automatically be generated.
If you want to collect traces manually, call dump_exit_locations directly.
Note that calling this in a script will generate stats after the dump is created, so the stats data may include exits from the dump itself.
In a script call:
at_exit do RubyVM::YJIT.dump_exit_locations("my_file.dump") end
Then run the file with the following options:
ruby --yjit --yjit-trace-exits test.rb
Once the code is done running, use Stackprof to read the dump file. See Stackprof documentation for options.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 48
def self.enable(stats: false, log: false, mem_size: nil, call_threshold: nil)
return false if enabled?
if Primitive.cexpr! 'RBOOL(rb_zjit_enabled_p)'
warn("Only one JIT can be enabled at the same time.")
return false
end
if mem_size
raise ArgumentError, "mem_size must be a Integer" unless mem_size.is_a?(Integer)
raise ArgumentError, "mem_size must be between 1 and 2048 MB" unless (1..2048).include?(mem_size)
end
if call_threshold
raise ArgumentError, "call_threshold must be a Integer" unless call_threshold.is_a?(Integer)
raise ArgumentError, "call_threshold must be a positive integer" unless call_threshold.positive?
end
at_exit { print_and_dump_stats } if stats
Primitive.rb_yjit_enable(stats, stats != :quiet, log, log != :quiet, mem_size, call_threshold)
end
Enable YJIT compilation. stats option decides whether to enable YJIT stats or not. log decides whether to enable YJIT compilation logging or not. Optional mem_size and call_threshold can be provided to override default configuration.
-
stats:-
false: Don’t enable stats. -
true: Enable stats. Print stats at exit. -
:quiet: Enable stats. Do not print stats at exit.
-
-
log:-
false: Don’t enable the log. -
true: Enable the log. Print log at exit. -
:quiet: Enable the log. Do not print log at exit.
-
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 12
def self.enabled?
Primitive.cexpr! 'RBOOL(rb_yjit_enabled_p)'
end
Check if YJIT is enabled.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 206
def self.log
return nil unless log_enabled?
Primitive.rb_yjit_get_log.map do |timestamp, path|
[Time.at(timestamp), path]
end
end
Return an array of log entries. Return nil when option is not passed or unavailable.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 22
def self.log_enabled?
Primitive.rb_yjit_log_enabled_p
end
Check if --yjit-log is used.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 32
def self.reset_stats!
Primitive.rb_yjit_reset_stats_bang
end
Discard statistics collected for --yjit-stats.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 188
def self.runtime_stats(key = nil)
raise TypeError, "non-symbol given" unless key.nil? || Symbol === key
Primitive.rb_yjit_get_stats(key)
end
Return a hash for statistics generated for the --yjit-stats command line option. Return nil when option is not passed or unavailable. If a symbol argument is provided, return only the value for the named stat. If any other type is provided, raises TypeError.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 17
def self.stats_enabled?
Primitive.rb_yjit_stats_enabled_p
end
Check if --yjit-stats is used.
# File tmp/rubies/ruby-4.0.0/yjit.rb, line 196
def self.stats_string
# Lazily require StringIO to avoid breaking miniruby
require 'stringio'
strio = StringIO.new
_print_stats(out: strio)
strio.string
end
Format and print out counters as a String. This returns a non-empty content only when --yjit-stats is enabled.