class Benchmarks::Helpers::Specification
Main benchmark helper
Constants
- EMPTY_STRING
- LABEL_SPACER
- MIN_SPACER_AMOUNT
- RANDOM_NEW_SEED
- SKIPPED_METHOD_INFO
- TEST_METHOD_INFO
Attributes
Public Class Methods
Source
# File benchmarks/benchmarks_helpers.rb, line 42 def initialize(answers, method_base_name: nil) @answers = Object.new.extend(answers) @methods = answers.instance_methods(false) @method_base_name = method_base_name || find_method_base_name @labels = generate_labels_for_methods @seed = RANDOM_NEW_SEED @name = EMPTY_STRING end
Public Instance Methods
Source
# File benchmarks/benchmarks_helpers.rb, line 130 def fetch_skip_methods_from(scenario, variant) return [] unless variant.key?(:skip_methods_for_scenario) methods_for = variant[:skip_methods_for_scenario] skip_methods = [] skip_methods += methods_for[:all] if methods_for[:all] skip_methods += methods_for[scenario[:name]] if methods_for[scenario[:name]] skip_methods end
Source
# File benchmarks/benchmarks_helpers.rb, line 86 def find_method_base_name @methods .map { |method_full_name| generate_slices_from(method_full_name) } .reduce(:&) .max_by(&:size) .join("_") end
Source
# File benchmarks/benchmarks_helpers.rb, line 103 def generate_labels_for_methods labels = {} max_size = 0 @methods.each do |method| authors, description = method.to_s.split("_#{@method_base_name}_") authors = authors.gsub("_and_", " & ").gsub(/[_\s]ai/, " AI") size = (authors + description).size max_size = size if size > max_size labels.merge!({ method => { authors:, description:, size: } }) end labels.each do |method, label| spacing = if label[:size] < max_size LABEL_SPACER * (MIN_SPACER_AMOUNT + max_size - label[:size]) else LABEL_SPACER * MIN_SPACER_AMOUNT end labels[method] = "#{label[:authors]} #{spacing} #{label[:description]} " end labels end
Prettier benchmark-ips labels identical in size
Source
# File benchmarks/benchmarks_helpers.rb, line 96 def generate_slices_from(method_name) words = method_name.to_s.split("_") (1..words.size).flat_map { words.each_cons(it).to_a } end
Generate slices aka N-grams aka ‘contiguous subarrays’ (elements must be neighbors)
Source
# File benchmarks/benchmarks_helpers.rb, line 53 def run(*method_arguments, scenario: {}, variant: {}, mode: :default, quiet: false) @skip_methods = fetch_skip_methods_from(scenario, variant) benchmark_config = case mode when :dry_run then { warmup: 1, time: 1, quiet: true } when :quick then { warmup: 1, time: 1, quiet: } when :slow then { warmup: 3, time: 6, quiet: true } when :jruby then { warmup: 3, time: 6, quiet:, iterations: 2 } else { warmup: 2, time: 5, quiet: false } end puts @name Benchmark.ips do |x| x.config(**benchmark_config) @methods.each do |method| next if @skip_methods.include?(method) if mode == :dry_run puts @labels[method] + TEST_METHOD_INFO else x.report(@labels[method]) { @answers.public_send(method, *method_arguments) } end end x.compare! end puts skipped_methods_for_print unless @skip_methods.empty? puts EMPTY_STRING if mode == :dry_run end
Main method, wrapper for Benchmark.ips
Source
# File benchmarks/benchmarks_helpers.rb, line 141 def skipped_methods_for_print @skip_methods.map { @labels[it] + SKIPPED_METHOD_INFO + SlowAnimal.show(before: " ") } end