#!/usr/bin/env ruby $:.unshift File.expand_path('../lib', __dir__) require 'benchmark/driver' require 'benchmark/driver/yaml_parser' require 'optparse' require 'yaml' options = {} args = OptionParser.new do |o| o.banner = "Usage: #{File.basename($0, '.*')} [options] [YAML]" o.on('-e', '--executables [EXECS]', 'Ruby executables (e1::path1; e2::path2; e3::path3;...)') do |e| options[:execs] ||= [] e.split(';').each do |name_path| name, path = name_path.split('::', 2) options[:execs] << Benchmark::Driver::Configuration::Executable.new(name, path || name) end end o.on('--rbenv [VERSIONS]', 'Ruby executables in rbenv (2.3.5;2.4.2;...)') do |r| options[:execs] ||= [] r.split(';').each do |version| path = `RBENV_VERSION='#{version}' rbenv which ruby`.rstrip abort "Failed to execute 'rbenv which ruby'" unless $?.success? options[:execs] << Benchmark::Driver::Configuration::Executable.new(version, path) end end o.on('-c', '--compare', 'Compare results (currently only supported in ips output)') do |v| options[:compare] = v end o.on('-r', '--repeat-count [NUM]', 'Try benchmark NUM times and use the fastest result') do |v| begin options[:repeat_count] = Integer(v) rescue ArgumentError abort "-r, --repeat-count must take Integer, but got #{v.inspect}" end end end.parse!(ARGV) abort "No YAML file is specified" if args.empty? args.each do |yaml| yaml = YAML.load(File.read(yaml)) Benchmark::Driver::Configuration.symbolize_keys!(yaml) begin config = Benchmark::Driver::YamlParser.parse(yaml) rescue ArgumentError $stderr.puts "benchmark-driver: Failed to parse #{yaml.dump}." $stderr.puts ' YAML format may be wrong. See error below:' $stderr.puts raise end options.each do |key, value| case key when :compare config.output_options.compare = value when :execs config.runner_options.executables = value when :repeat_count config.runner_options.repeat_count = value else raise "Unhandled option: #{key.inspect}" end end Benchmark::Driver.run(config) end