class Fruity::ComparisonRun
Attributes
stats[R]
Public Class Methods
new(group, timings, baselines)
click to toggle source
timings
must be an array of size ‘group.size` of arrays of delays or of arrays of [delay, baseline]
Calls superclass method
# File lib/fruity/comparison_run.rb, line 10 def initialize(group, timings, baselines) raise ArgumentError, "Expected timings to be an array with #{group.size} elements (was #{timings.size})" unless timings.size == group.size super filter = group.options.fetch(:filter) baseline = Util.filter(baselines, *filter) if baseline_type == :single @stats = timings.map.with_index do |series, i| case baseline_type when :split Util.difference(Util.filter(series, *filter), Util.filter(baselines.fetch(i), *filter)) when :single Util.difference(Util.filter(series, *filter), baseline) when :none Util.stats(series) end end.freeze end
Public Instance Methods
baseline_type()
click to toggle source
# File lib/fruity/comparison_run.rb, line 95 def baseline_type if baselines.nil? :none elsif baselines.first.is_a?(Array) :split else :single end end
comparison(cur = 0, vs = 1)
click to toggle source
# File lib/fruity/comparison_run.rb, line 81 def comparison(cur = 0, vs = 1) Util.compare_stats(@stats[cur], @stats[vs]) end
export(fn = (require "tmpdir"; "
click to toggle source
# File lib/fruity/comparison_run.rb, line 49 def export(fn = (require "tmpdir"; "#{Dir.tmpdir}/export.csv")) require "csv" CSV.open(fn, "wb") do |csv| head = group.elements.keys case baseline_type when :split head = head.flat_map{|h| [h, "#{head} bl"]} data = timings.zip(baselines).flatten(1).transpose when :single data = (timings + [baselines]).transpose head << "baseline" else data = timings.transpose end csv << head data.each{|vals| csv << vals} end fn end
factor(cur = 0, vs = 1)
click to toggle source
# File lib/fruity/comparison_run.rb, line 73 def factor(cur = 0, vs = 1) comparison(cur, vs)[:factor] end
factor_range(cur = 0, vs =1)
click to toggle source
# File lib/fruity/comparison_run.rb, line 77 def factor_range(cur = 0, vs =1) comparison(cur, vs)[:min]..comparison(cur, vs)[:max] end
format_comparison(cmp)
click to toggle source
# File lib/fruity/comparison_run.rb, line 85 def format_comparison(cmp) ratio = cmp[:factor] prec = cmp[:precision] if ratio.abs > 1.8 "#{ratio}x ± #{prec}" else "#{(ratio - 1)*100}% ± #{prec*100}%" end end
size()
click to toggle source
# File lib/fruity/comparison_run.rb, line 69 def size timings.first.size end
to_s()
click to toggle source
# File lib/fruity/comparison_run.rb, line 30 def to_s order = (0...group.size).sort_by{|i| @stats[i][:mean] } results = group.elements.map{|n, exec| Util.result_of(exec, group.options) } order.each_cons(2).map do |i, j| cmp = comparison(i, j) s = if cmp[:factor] == 1 "%{cur} is similar to %{vs}%{different}" else "%{cur} is faster than %{vs} by %{ratio}%{different}" end s % { :cur => group.elements.keys[i], :vs => group.elements.keys[j], :ratio => format_comparison(cmp), :different => results[i] == results[j] ? "" : " (results differ: #{results[i]} vs #{results[j]})" } end.join("\n") end