news 2026/9/14 13:53:57

如何用 benchmark_driver 运行 Ruby 内置基准测试并比较两个解释器?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 benchmark_driver 运行 Ruby 内置基准测试并比较两个解释器?

如何用 benchmark_driver 运行 Ruby 内置基准测试并比较两个解释器?

【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby

Ruby 仓库的benchmark/目录内置了一批基准测试定义(.rb.yml文件),配套说明见 benchmark/README.md。如果你想在本地跑这些基准,或者在“系统 Ruby”和“另一个 Ruby 解释器(例如开了--jit的版本)”之间做性能对比,可以用benchmark_driver这个 gem 完成。本文的操作路径来自该 README 与仓库 Makefile 规则,前提是你已经获取了 ruby 仓库源码,并且能安装 Ruby gem。

准备:安装 benchmark_driver

README 给出的第一步是安装 gem:

gem install benchmark_driver

安装完成后,命令行会出现benchmark-driver。它接受.rb或 YAML 基准文件作为参数,并支持通过--help查看全部选项:

benchmark-driver --help

--help输出的用法为:

benchmark-driver [options] RUBY|YAML... -r, --runner TYPE Specify runner type: ips, time, memory, once, block (default: ips) -o, --output TYPE Specify output type: compare, simple, markdown, record, all (default: compare) -e, --executables EXECS Ruby executables (e1::path1 arg1; e2::path2 arg2;...) --rbenv VERSIONS Ruby executables in rbenv (x.x.x arg1;y.y.y arg2;...) --repeat-count NUM Try benchmark NUM times and use the fastest result or the worst memory usage --repeat-result TYPE Yield "best", "average" or "worst" result with --repeat-count (default: best) --alternate Alternate executables instead of running the same executable in a row with --repeat-count --bundler Install and use gems specified in Gemfile --filter REGEXP Filter out benchmarks with given regexp --run-duration SECONDS Warmup estimates loop_count to run for this duration (default: 3) --timeout SECONDS Timeout ruby command execution with timeout(1) -v, --verbose Verbose mode. Multiple -v options increase visibility (max: 2)

运行单个基准脚本

最简单的用法是用$PATH中的ruby跑一个脚本。以benchmark/下的斐波那契基准 benchmark/app_fib.rb 为例:

benchmark-driver benchmark/app_fib.rb

也可以直接跑一整批.rb基准:

benchmark-driver benchmark/*.rb

比较两个解释器

核心场景是同时用两个 Ruby 可执行文件跑同一批基准。README 给出的写法是通过多个-e指定解释器路径和参数,例如第二个解释器带--jit

# Run benchmark scripts with multiple Ruby executables or options benchmark-driver benchmark/*.rb -e /path/to/ruby -e '/path/to/ruby --jit'

/path/to/ruby替换为你实际的 Ruby 可执行文件路径即可;第二个示例中的--jit是该解释器的启动参数,不是 benchmark-driver 自身的参数。

如果你的多个 Ruby 版本由 rbenv 管理,README 提供了替代写法,用--rbenv指定版本号列表(分号分隔,版本后跟解释器参数):

# Or compare Ruby versions managed by rbenv benchmark-driver benchmark/*.rb --rbenv '2.5.1;2.6.0-preview2 --jit'

调整 runner、输出与过滤

同一批基准还可以换采集方式或输出形式,README 示例:

# You can collect many metrics in many ways benchmark-driver benchmark/*.rb --runner memory --output markdown

结合--help的说明,几个对“两解释器比较”最常用的选项是:

  • -r, --runnerips(默认)、timememoryonceblock五种;
  • -o, --outputcompare(默认)、simplemarkdownrecordall,默认的compare即输出两个解释器之间的对比;
  • --filter REGEXP:只跑文件名匹配正则的子集;
  • --repeat-count NUM--repeat-result:重复跑多轮,默认取最快结果(best),也可取averageworstmemory下取最差内存占用);
  • --timeout SECONDS:用timeout(1)限制单条 ruby 命令的执行时间;
  • -v:详细模式,可叠加,最多两级。

运行 YAML 基准

benchmark/中一部分基准是 YAML 定义,README 指出它们用于“复杂 setup 或更精确的测量”:

# Some are defined with YAML for complex setup or accurate measurement benchmark-driver benchmark/*.yml

YAML 基准的结构可以参考 benchmark/vm_ivar.yml:

prelude: "@a = 1\n" benchmark: vm_ivar: | j = @a k = @a loop_count: 30000000

其中prelude是前置代码,benchmark下是基准体,loop_count指定循环次数。

用 make benchmark 比较“对比 Ruby”与“刚构建的 Ruby”

如果你在源码树中构建过 Ruby,README 还给出基于 Makefile 的入口:make benchmark会自动下载受支持的 benchmark_driver 版本并用它跑基准。defs/gmake.mk 中对应的规则显示,它会用两个执行体各跑一遍:compare-ruby::$(COMPARE_RUBY)built-ruby::$(BENCH_RUBY)(即仓库刚构建出的 ruby),并给两者附加--disable-gem等参数。常用形式:

# Run all benchmarks with the ruby in the $PATH and the built ruby make benchmark # Or compare with specific ruby binary make benchmark COMPARE_RUBY="/path/to/ruby --jit" # Run vm benchmarks make benchmark ITEM=vm # Run some limited benchmarks in ITEM-matched files make benchmark ITEM=vm OPTS=--filter=block # You can specify the benchmark by exact filenames instead of matching ITEM: make benchmark ARGS=benchmark/erb_render.yml # You can specify any option via $OPTS make benchmark OPTS="--help"

ITEM=vm表示只跑文件名匹配vm的基准(对应大量vm_*.yml文件);ARGS=则按精确文件名指定单个基准。README 特别说明通过make benchmark还可以使用一些专门的 runner 插件:

# -r peak, -r size, -r total, -r utime, -r stime, -r cutime, -r cstime make benchmark ITEM=vm_bigarray OPTS="-r peak"

结果验证与限制

  • 默认输出类型是compare,运行结束后终端会输出各基准在两个(或多个)解释器上的对比结果;需要 Markdown 或记录形式时改用--output,不要按示例输出猜测具体数值——README 未提供固定的示例结果,实际数值取决于你的机器和被测解释器。
  • -v提高详细度来确认实际调用的解释器路径与参数是否符合预期(例如--jit是否生效)。
  • make benchmark路径依赖miniruby与自动下载的 benchmark-driver,属于构建源码树之后的用法;没有构建源码时直接用gem install benchmark_driver+benchmark-driver命令即可。
  • 参数含义以上文--help原文为准;README 未给出的默认值或行为(例如特定 runner 的内部实现)不在本文范围内。

【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 13:53:33

非技术创业者如何选择小程序开发方式?模板与AI编程的边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 13:53:03

MATLAB三角级数法生成人工地震波原理与工程实现

简介:本资源是一份面向地球物理、石油勘探及地震工程领域初学者与科研人员的人工地震波合成实践工具包,聚焦于利用MATLAB实现三角级数法生成可控参数的人工地震波,解决真实地震记录稀缺、实验波形定制难等实际建模需求。压缩包为RAR格式&…

作者头像 李华
网站建设 2026/9/14 13:52:38

EMC通用标准与产品族标准选型指南

1. 通用标准与产品族标准:EMC合规路上最容易被误解的“交通规则”刚入行做EMC测试时,我拿着一份EN 55032报告去跟结构工程师解释为什么机壳开孔要改,对方反问:“这个标准不是说‘辐射发射限值30–1000 MHz ≤40 dBμV/m’吗&#…

作者头像 李华
网站建设 2026/9/14 13:49:34

三步搭出零配置MCP网关:FastAPI分布式部署实战

三步搭出零配置MCP网关:FastAPI分布式部署实战 【免费下载链接】fastapi_mcp Expose your FastAPI endpoints as Model Context Protocol (MCP) tools, with Auth! 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi_mcp 3 个 FastAPI 服务&#xf…

作者头像 李华
网站建设 2026/9/14 13:47:41

网安人口中的蜜罐是指什么?

目录 1、什么是蜜罐? 2、蜜罐的几种工作方式 3、沙箱和蜜罐的区别 4、公网蜜罐与内网蜜罐侧重点的区别 5、使用蜜罐的好处 一个接入互联网的网站,只要能和外部产生通信,就有被黑客攻击的可能——就像飞机在控制无法关停发动机一样。但是…

作者头像 李华