Ruby 如何构建并启用 YJIT 编译器,以及如何确认它已生效?

发布时间:2026/9/13 4:59:20
Ruby 如何构建并启用 YJIT 编译器,以及如何确认它已生效?
Ruby 如何构建并启用 YJIT 编译器以及如何确认它已生效【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby如果你希望在 CRuby 中获得 JIT 编译加速需要做的不是安装某个现成组件而是从源码构建一个启用 YJIT 的 Ruby 二进制然后在运行时用--yjit选项或环境变量、Ruby 代码打开它并确认它确实处于启用状态。YJIT 是内嵌在 CRuby 里的轻量级 Ruby JIT目前支持 macOS、Linux 和 BSDCPU 限 x86-64 与 arm64/aarch64见 doc/jit/yjit.md。本文按“准备依赖 → 构建 → 启用 → 验证”的顺序走完这条路径。准备条件构建工具链与 Rust 编译器按 doc/contributing/building_ruby.md 和 doc/jit/yjit.md 的要求构建一个带 YJIT 的 Ruby 需要构建 CRuby 的常规工具链C 编译器为 RubyGems 需要 OpenSSL1.1.x / 3.0.x 或 LibreSSL、libyaml0.1.7 及以上、zlib从 git 仓库构建时额外需要autoconf2.67 及以上、ruby3.1 及以上、git2.32 及以上Rust 编译器rustc版本要求见 yjit/Cargo.toml 中的rust-version 1.58.0即 1.58.0可选只有在以 dev/debug 模式构建时才需要 Rust 的cargo。文档的建议是如果你不打算修改 YJIT 自身的 Rust 代码直接用操作系统的包管理器安装rustc即可要改 YJIT 源码时才建议使用 Rust 官方的一方安装方式。获取源码并构建带 YJIT 的 Ruby克隆ruby/ruby仓库并进入目录git clone https://github.com/ruby/ruby yjit cd yjitYJIT 的ruby二进制可以用 GCC 或 Clang 构建可选三种配置模式。以下安装前缀$HOME/.rubies/ruby-yjit是文档示例中使用的路径可按需改成自己的安装位置release 模式文档推荐用于最高性能配合 GCC# Configure in release mode for maximum performance, build and install ./autogen.sh ./configure --enable-yjit --prefix$HOME/.rubies/ruby-yjit --disable-install-doc make -j make installdevdebug模式性能较低但包含扩展的 YJIT 统计信息适合开发# Configure in lower-performance dev (debug) mode for development, build and install ./autogen.sh ./configure --enable-yjitdev --prefix$HOME/.rubies/ruby-yjit --disable-install-doc make -j make installstats 模式开启扩展统计但不带 dev 模式的慢速运行时检查# Configure in extended-stats mode without slow runtime checks, build and install ./autogen.sh ./configure --enable-yjitstats --prefix$HOME/.rubies/ruby-yjit --disable-install-doc make -j make installmacOS 上可能需要先通过 Homebrew 装好依赖并用--with-opt-dir指明库的位置# Install dependencies brew install openssl libyaml # Configure in dev (debug) mode for development, build and install ./autogen.sh ./configure --enable-yjitdev --prefix$HOME/.rubies/ruby-yjit --disable-install-doc --with-opt-dir$(brew --prefix openssl):$(brew --prefix readline):$(brew --prefix libyaml) make -j make install如果想指定 C 编译器在运行./configure之前设置export CC/path/to/my/chosen/c/compiler其中/path/to/my/chosen/c/compiler是文档中的占位写法替换为你实际编译器如 gcc 或 clang的路径。构建完成后文档给出的验证手段有两级make btest运行 bootstraptest 目录下的快速测试make -j test-all运行完整测试集。此外还有make yjit-check文档描述为“运行快速检查以确认 YJIT 工作正常”。启用 YJIT 的三种方式YJIT 默认是禁用的--yjit选项说明为“enable YJIT (disabled by default)”。构建完成后有三种启用途径可结合使用命令行选项运行时加--yjit例如./miniruby --yjit myscript.rb。构建目录内的./miniruby可直接使用也可以切换全局的rubychruby ruby-yjit ruby myscript.rb环境变量RUBY_YJIT_ENABLE适用于不方便给 Ruby 追加命令行参数的部署脚本。Ruby 代码调用RubyVM::YJIT.enable可以在应用启动完成后再开启 YJIT文档指出这样可以避免编译初始化阶段用不到的代码。如果要携带--yjit-*调优参数但暂不启动 YJIT可加--yjit-disable。相关调优选项默认值均引自文档--yjit-mem-sizeN为 YJIT 内存使用的软上限单位 MiB默认 128--yjit-call-thresholdN为开始编译某函数所需的调用次数默认 30进程内 ISEQ 数达到 40,000 时提升到 120。确认 YJIT 已生效文档给出了明确的验证方式用RubyVM::YJIT.enabled?检查或检查ruby --yjit -v的输出是否包含YJIT字符串ruby --yjit -v ruby 3.3.0dev (2023-01-31T15:11:10Z master 2a0bf269c9) YJIT dev [x86_64-darwin22] ruby --yjit -e p RubyVM::YJIT.enabled? true ruby -e RubyVM::YJIT.enable; p RubyVM::YJIT.enabled? true第一行是文档示例输出具体版本号、提交号和平台串会因你的构建而异判断依据是行内出现YJIT后两个示例输出true表示 YJIT 已成功启用。确认“编译确实在发生”而不只是“开关已打开”文档提供了三个进一步的手段--yjit-stats程序执行结束后打印编译与运行统计有运行时开销也可以--yjit-statsquiet只采集不打印通过RubyVM::YJIT.runtime_stats读取。统计中的:ratio_in_yjit表示由 YJIT 执行的 YARV 指令占比文档提到理想值应尽量接近 99%调大--yjit-mem-size通常有助于提高这个比例--yjit-log[file|dir]记录编译事件。不指定文件时应用退出时把最近 1024 条日志打印到 stderr--yjit-logquiet则在环形缓冲区中收集通过RubyVM::YJIT.log访问反汇编查看某个方法的机器码在脚本里加puts RubyVM::YJIT.disasm(method(:method_name))把method_name换成你的方法名。文档提醒如果该方法尚未被编译就不会有任何机器码生成。限制与边界按 doc/jit/yjit.md 的说明需要注意两点平台限制YJIT 仅支持 macOS、Linux、BSD 上的 x86-64 与 arm64/aarch64其他平台组合无法使用内存代价因为 JIT 需要在内存中生成机器码并维护额外状态启用 YJIT 后内存占用高于纯解释执行。上限可通过--yjit-mem-size默认 128 MiB限制code_region_size yjit_alloc_size总和和--yjit-exec-mem-size限制可执行内存块大小调整--yjit-code-gc自 Ruby 3.3 起默认禁用打开后当可执行内存达到上限时丢弃全部机器码并重新编译可以用更小的内存上限但达到上限时可能有轻微性能下降。完成构建与验证后如果你的目标是让长驻 worker 真正吃到 YJIT 的收益文档在“Performance Tips for Production Deployments”一节建议尽量让进程少重启、关注ratio_in_yjit相关调优项--yjit-mem-size、--yjit-cold-threshold等完整列表见 doc/jit/yjit.md 的 Command-Line Options 部分。【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考