模組 RubyVM::YJIT

此模組允許內省 YJIT,CRuby 的即時編譯器。模組中的所有內容都具有高度的實作特定性,與標準函式庫相比,API 可能不太穩定。

如果 YJIT 不支援 CRuby 建置的特定平台,此模組可能不存在。

公開類別方法

code_gc() 按一下以切換來源

捨棄現有的已編譯程式碼以回收記憶體,並允許在未來重新編譯。

# File yjit.rb, line 224
def self.code_gc
  Primitive.rb_yjit_code_gc
end
dump_exit_locations(filename) 按一下以切換來源

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 文件以取得選項。

# File yjit.rb, line 148
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
enable(stats: false) 按一下以切換來源

啟用 YJIT 編譯。stats 選項決定是否啟用 YJIT 統計資料。

  • false:停用統計資料。

  • true:啟用統計資料。在結束時列印統計資料。

  • :quiet:啟用統計資料。不要在結束時列印統計資料。

# File yjit.rb, line 36
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
enabled?() 按一下以切換來源

檢查 YJIT 是否已啟用。

# File yjit.rb, line 12
def self.enabled?
  Primitive.cexpr! 'RBOOL(rb_yjit_enabled_p)'
end
reset_stats!() 按一下以切換來源

捨棄為 --yjit-stats 收集的統計資料。

# File yjit.rb, line 27
def self.reset_stats!
  Primitive.rb_yjit_reset_stats_bang
end
runtime_stats(context: false) 按一下以切換來源

傳回為 --yjit-stats 命令列選項產生的統計資料的雜湊。當未傳遞或無法使用選項時,傳回 nil

# File yjit.rb, line 158
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
stats_enabled?() 按一下以切換來源

檢查是否使用 --yjit-stats

# File yjit.rb, line 17
def self.stats_enabled?
  Primitive.rb_yjit_stats_enabled_p
end
stats_string() 按一下以切換來源

格式化並列印計數器為 String。這僅在啟用 --yjit-stats 時傳回非空內容。

# File yjit.rb, line 191
def self.stats_string
  # Lazily require StringIO to avoid breaking miniruby
  require 'stringio'
  strio = StringIO.new
  _print_stats(out: strio)
  strio.string
end

私有類別方法

format_number(pad, number) 按一下以切換來源

格式化大型數字,並加上逗號分隔符號以方便閱讀

# File yjit.rb, line 480
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 488
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() 按一下以切換來源

列印統計資料並傾印結束位置