require "test_helper"
require "minitest/benchmark"
require 'fileutils'
require 'stop_watch'
require 'gruff'
include StopWatch
class BenchmarkHelper < Minitest::Benchmark
TIMER = Hash.new.tap do |t|
t.default_proc = proc do |hash, key|
hash[key] = Struct.new(:ruby, :rust).new(Timer.new, Timer.new)
end
end
def self.bench_range
[20_000, 40_000, 60_000, 80_000, 100_000]
end
def graph_benchmarks
if TIMER[@file].rust.time? && TIMER[@file].ruby.time?
g = Gruff::Line.new
g.title = File.basename(@file).to_s[0..-4].split('_').map(&:capitalize).join(' ')
g.labels = (instance_exec{defined?(self.class.bench_range) ? self.class.bench_range : nil} || BenchmarkHelper.bench_range).
each.with_index.
reduce({}) {|h, (v, i)|
h[i+1]=v; h
}.merge({0 => 0})
g.data(:ruby, TIMER[@file].ruby.times.unshift(0))
g.data(:rust, TIMER[@file].rust.times.unshift(0))
outfile = File.join(File.expand_path('..', __dir__), 'doc', 'graph')
FileUtils.mkdir_p outfile
outfile = File.join(outfile, File.basename(@file)[0..-3] + 'png')
g.write( outfile )
end
end
def benchmark_graph lang
assert_performance_constant do |n|
TIMER[@file][lang].mark
n.times do
yield
end
end
TIMER[@file][lang].mark
end
end