Spec-Zone.ru › Ruby 3.3

module RubyVM::YJIT

Этот модуль позволяет проводить интроспекцию YJIT, компилятора Just-in-Time CRuby. Всё в модуле сильно зависит от реализации, и API может быть менее стабильным по сравнению со стандартной библиотекой.

Этот модуль может отсутствовать, если YJIT не поддерживает конкретную платформу, для которой построен CRuby.

Публичные методы класса

code_gc() Показать исходный код
# File yjit.rb, line 220
def self.code_gc
  Primitive.rb_yjit_code_gc
end

Отбросьте существующий скомпилированный код, чтобы освободить память и позволить будущие перекомпиляции.

dump_exit_locations(filename) Показать исходный код
# File yjit.rb, line 144
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 сохраняет места выхода в указанный файл.

Использование:

Если --yjit-exit-locations передаётся, файл с именем “yjit_exit_locations.dump” будет автоматически сгенерирован.

Если вы хотите собрать трассировки вручную, вызовите dump_exit_locations напрямую.

Обратите внимание, что вызов этого в скрипте сгенерирует статистику после создания дампа, поэтому данные статистики могут включать выходы из самого дампа.

В скрипте вызов:

at_exit do
  RubyVM::YJIT.dump_exit_locations("my_file.dump")
end

Затем запустите файл со следующими параметрами:

ruby --yjit --yjit-trace-exits test.rb

После завершения работы кода, используйте Stackprof для чтения файла дампа. См. документацию Stackprof для параметров.

enable(stats: false) Показать исходный код
# File yjit.rb, line 32
def self.enable(stats: false)
  return false if enabled?
  at_exit { print_and_dump_stats } if stats
  Primitive.rb_yjit_enable(stats, stats != :quiet)
end

Включить компиляцию YJIT.

enabled?() Показать исходный код
# File yjit.rb, line 12
def self.enabled?
  Primitive.cexpr! 'RBOOL(rb_yjit_enabled_p)'
end

Проверить, включен ли YJIT.

reset_stats!() Показать исходный код
# File yjit.rb, line 27
def self.reset_stats!
  Primitive.rb_yjit_reset_stats_bang
end

Отбросить статистику, собранную для --yjit-stats.

runtime_stats(context: false) Показать исходный код
# File yjit.rb, line 154
def self.runtime_stats(context: false)
  stats = Primitive.rb_yjit_get_stats(context)
  return stats if stats.nil?

  stats[:object_shape_count] = Primitive.object_shape_count
  return stats unless Primitive.rb_yjit_stats_enabled_p

  side_exits = total_exit_count(stats)
  total_exits = side_exits + stats[:leave_interp_return]

  # Number of instructions that finish executing in YJIT.
  # See :count-placement: about the subtraction.
  retired_in_yjit = stats[:yjit_insns_count] - side_exits

  # Average length of instruction sequences executed by YJIT
  avg_len_in_yjit = total_exits > 0 ? retired_in_yjit.to_f / total_exits : 0

  # Proportion of instructions that retire in YJIT
  total_insns_count = retired_in_yjit + stats[:vm_insns_count]
  yjit_ratio_pct = 100.0 * retired_in_yjit.to_f / total_insns_count
  stats[:total_insns_count] = total_insns_count
  stats[:ratio_in_yjit] = yjit_ratio_pct

  # Make those stats available in RubyVM::YJIT.runtime_stats as well
  stats[:side_exit_count]  = side_exits
  stats[:total_exit_count] = total_exits
  stats[:avg_len_in_yjit]  = avg_len_in_yjit

  stats
end

Возвращает словарь статистики, сгенерированной для командной строки --yjit-stats . Возвращает nil , если параметр не передан или недоступен.

stats_enabled?() Показать исходный код
# File yjit.rb, line 17
def self.stats_enabled?
  Primitive.rb_yjit_stats_enabled_p
end

Проверить, используется ли --yjit-stats.

stats_string() Показать исходный код
# File yjit.rb, line 187
def self.stats_string
  # Lazily require StringIO to avoid breaking miniruby
  require 'stringio'
  strio = StringIO.new
  _print_stats(out: strio)
  strio.string
end

Форматирует и выводит счётчики в виде String. Возвращает непустое значение только когда --yjit-stats включен.

Приватные методы класса

format_number(pad, number) Показать исходный код
# File yjit.rb, line 476
def format_number(pad, number)
  s = number.to_s
  i = s.index('.') || s.size
  s.insert(i -= 3, ',') while i > 3
  s.rjust(pad, ' ')
end

Форматирование больших чисел с разделителями для лучшей читабельности.

format_number_pct(pad, number, total) Показать исходный код
# File yjit.rb, line 484
def format_number_pct(pad, number, total)
  padded_count = format_number(pad, number)
  percentage = number.fdiv(total) * 100
  formatted_pct = "%4.1f%%" % percentage
  "#{padded_count} (#{formatted_pct})"
end

Форматирование числа вместе с процентом от общего значения.

print_and_dump_stats() Показать исходный код
# File yjit.rb, line 237
def print_and_dump_stats
  if Primitive.rb_yjit_print_stats_p
    _print_stats
  end
  _dump_locations
end

Вывод статистики и сохранение мест выхода.

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API