如何用 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, --runner:ips(默认)、time、memory、once、block五种;-o, --output:compare(默认)、simple、markdown、record、all,默认的compare即输出两个解释器之间的对比;--filter REGEXP:只跑文件名匹配正则的子集;--repeat-count NUM与--repeat-result:重复跑多轮,默认取最快结果(best),也可取average或worst(memory下取最差内存占用);--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/*.ymlYAML 基准的结构可以参考 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),仅供参考