From d91c07de37fff30cfc928e2eda5fb016ef63427c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 7 Oct 2026 19:21:43 +0900 Subject: [PATCH] Keep RUBY_YJIT_ENABLE and RUBY_ZJIT_ENABLE out of benchmark runs With RUBY_YJIT_ENABLE=1 in the environment, the default "interp" executable silently ran with YJIT and the comparison measured YJIT against itself. Co-Authored-By: Claude Opus 5.5 --- lib/benchmark_runner/cli.rb | 5 +++++ test/benchmark_runner_cli_test.rb | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/benchmark_runner/cli.rb b/lib/benchmark_runner/cli.rb index ed59d2d1..25a89869 100644 --- a/lib/benchmark_runner/cli.rb +++ b/lib/benchmark_runner/cli.rb @@ -45,6 +45,11 @@ def run force_pinning: args.force_pinning ) + # Leave JIT selection to each executable's flags. Ruby reads these only when + # no JIT flag is given, so RUBY_YJIT_ENABLE=1 would turn "interp" into YJIT. + ENV.delete("RUBY_YJIT_ENABLE") + ENV.delete("RUBY_ZJIT_ENABLE") + # Collect ruby version descriptions for all executables upfront args.executables.each do |name, executable| ruby_descriptions[name] = `#{executable.shelljoin} -v`.chomp diff --git a/test/benchmark_runner_cli_test.rb b/test/benchmark_runner_cli_test.rb index 7baf82f3..721b1785 100644 --- a/test/benchmark_runner_cli_test.rb +++ b/test/benchmark_runner_cli_test.rb @@ -9,7 +9,7 @@ describe BenchmarkRunner::CLI do before do @original_env = {} - ['WARMUP_ITRS', 'MIN_BENCH_ITRS', 'MIN_BENCH_TIME', 'BENCHMARK_QUIET', 'RUBY_BENCH_RACTOR_GC'].each do |key| + ['WARMUP_ITRS', 'MIN_BENCH_ITRS', 'MIN_BENCH_TIME', 'BENCHMARK_QUIET', 'RUBY_BENCH_RACTOR_GC', 'RUBY_YJIT_ENABLE', 'RUBY_ZJIT_ENABLE'].each do |key| @original_env[key] = ENV[key] end @@ -19,6 +19,8 @@ ENV['MIN_BENCH_TIME'] = '0' # Suppress benchmark output during tests ENV['BENCHMARK_QUIET'] = '1' + ENV.delete('RUBY_YJIT_ENABLE') + ENV.delete('RUBY_ZJIT_ENABLE') end after do @@ -327,6 +329,26 @@ def create_args(overrides = {}) end end + ['RUBY_YJIT_ENABLE', 'RUBY_ZJIT_ENABLE'].each do |var| + it "does not let #{var} enable a JIT for an executable without JIT flags" do + Dir.mktmpdir do |tmpdir| + ENV[var] = '1' + args = create_args( + executables: { 'interp' => [RbConfig.ruby] }, + name_filters: ['fib'], + out_path: tmpdir + ) + + cli = BenchmarkRunner::CLI.new(args) + capture_io { cli.run } + + json_files = Dir.glob(File.join(tmpdir, "*.json")) + json_data = JSON.parse(File.read(json_files.first)) + refute_match(/\+[YZ]JIT/, json_data['metadata']['interp']) + end + end + end + it 'handles benchmark with category filter' do Dir.mktmpdir do |tmpdir| args = create_args(