benchmarks/match_array/passing_with_duplicate_items.rb
$LOAD_PATH.unshift "./lib"
require 'benchmark'
require 'rspec/expectations'
extend RSpec::Matchers
sizes = [10, 100, 1000, 2000]
puts "rspec-expectations #{RSpec::Expectations::Version::STRING} -- #{RUBY_ENGINE}/#{RUBY_VERSION}"
puts
puts "Passing `match_array` expectation with lists of integers including duplicate values"
puts
Benchmark.benchmark do |bm|
sizes.each do |size|
actual = Array.new(size) { rand(size / 2) }
expecteds = Array.new(3) { actual.shuffle }
expecteds.each do |expected|
bm.report("#{size.to_s.rjust(5)} items") do
expect(actual).to match_array(expected)
end
end
end
end
__END__
Before new composable matchers algo:
10 items 0.000000 0.000000 0.000000 ( 0.000665)
10 items 0.000000 0.000000 0.000000 ( 0.000027)
10 items 0.000000 0.000000 0.000000 ( 0.000015)
100 items 0.000000 0.000000 0.000000 ( 0.000250)
100 items 0.000000 0.000000 0.000000 ( 0.000176)
100 items 0.000000 0.000000 0.000000 ( 0.000181)
1000 items 0.010000 0.000000 0.010000 ( 0.013612)
1000 items 0.020000 0.000000 0.020000 ( 0.013409)
1000 items 0.020000 0.000000 0.020000 ( 0.018222)
2000 items 0.060000 0.000000 0.060000 ( 0.057428)
2000 items 0.060000 0.000000 0.060000 ( 0.058242)
2000 items 0.060000 0.000000 0.060000 ( 0.063026)
After:
10 items 0.000000 0.000000 0.000000 ( 0.001835)
10 items 0.000000 0.000000 0.000000 ( 0.000327)
10 items 0.000000 0.000000 0.000000 ( 0.000336)
100 items 0.030000 0.000000 0.030000 ( 0.025134)
100 items 0.030000 0.000000 0.030000 ( 0.032476)
100 items 0.020000 0.000000 0.020000 ( 0.024273)
1000 items 2.600000 0.040000 2.640000 ( 2.649328)
1000 items 2.510000 0.020000 2.530000 ( 2.523448)
1000 items 2.470000 0.000000 2.470000 ( 2.476770)
2000 items 11.590000 0.110000 11.700000 ( 11.719525)
2000 items 10.750000 0.080000 10.830000 ( 10.845655)
2000 items 11.140000 0.080000 11.220000 ( 11.241852)
With "smaller subproblem" optimization: (about 35% faster)
10 items 0.000000 0.000000 0.000000 ( 0.001236)
10 items 0.000000 0.000000 0.000000 ( 0.000278)
10 items 0.000000 0.000000 0.000000 ( 0.000293)
100 items 0.010000 0.000000 0.010000 ( 0.013229)
100 items 0.020000 0.000000 0.020000 ( 0.013932)
100 items 0.020000 0.000000 0.020000 ( 0.019739)
1000 items 1.580000 0.030000 1.610000 ( 1.622586)
1000 items 1.670000 0.020000 1.690000 ( 1.683174)
1000 items 1.570000 0.010000 1.580000 ( 1.588718)
2000 items 7.030000 0.100000 7.130000 ( 7.139178)
2000 items 7.220000 0.090000 7.310000 ( 7.328606)
2000 items 6.930000 0.130000 7.060000 ( 7.070295)
With "implement `values_match?` ourselves" optimization: (about 20% faster)
10 items 0.000000 0.000000 0.000000 ( 0.001352)
10 items 0.000000 0.000000 0.000000 ( 0.000313)
10 items 0.000000 0.000000 0.000000 ( 0.000298)
100 items 0.010000 0.000000 0.010000 ( 0.011200)
100 items 0.010000 0.000000 0.010000 ( 0.013465)
100 items 0.020000 0.000000 0.020000 ( 0.021589)
1000 items 1.320000 0.030000 1.350000 ( 1.350071)
1000 items 1.280000 0.020000 1.300000 ( 1.298206)
1000 items 1.370000 0.010000 1.380000 ( 1.392149)
2000 items 6.120000 0.110000 6.230000 ( 6.252104)
2000 items 6.170000 0.090000 6.260000 ( 6.270807)
2000 items 5.910000 0.150000 6.060000 ( 6.066389)
With `match_when_sorted?` optimization: (many orders of magnitude faster!)
10 items 0.000000 0.000000 0.000000 ( 0.001134)
10 items 0.000000 0.000000 0.000000 ( 0.000029)
10 items 0.000000 0.000000 0.000000 ( 0.000020)
100 items 0.000000 0.000000 0.000000 ( 0.000070)
100 items 0.000000 0.000000 0.000000 ( 0.000066)
100 items 0.000000 0.000000 0.000000 ( 0.000065)
1000 items 0.000000 0.000000 0.000000 ( 0.000612)
1000 items 0.000000 0.000000 0.000000 ( 0.000608)
1000 items 0.000000 0.000000 0.000000 ( 0.000613)
2000 items 0.010000 0.000000 0.010000 ( 0.001235)
2000 items 0.000000 0.000000 0.000000 ( 0.001282)
2000 items 0.000000 0.000000 0.000000 ( 0.001227)
With e === a || a == e || values_match?(e,a)
10 items 0.010000 0.000000 0.010000 ( 0.001258)
10 items 0.000000 0.000000 0.000000 ( 0.000034)
10 items 0.000000 0.000000 0.000000 ( 0.000027)
100 items 0.000000 0.000000 0.000000 ( 0.000124)
100 items 0.000000 0.000000 0.000000 ( 0.000151)
100 items 0.000000 0.000000 0.000000 ( 0.000121)
1000 items 0.000000 0.000000 0.000000 ( 0.001212)
1000 items 0.000000 0.000000 0.000000 ( 0.001193)
1000 items 0.000000 0.000000 0.000000 ( 0.001293)
2000 items 0.000000 0.000000 0.000000 ( 0.002433)
2000 items 0.010000 0.000000 0.010000 ( 0.002351)
2000 items 0.000000 0.000000 0.000000 ( 0.002404)
With values_match?(e,a)
10 items 0.000000 0.000000 0.000000 ( 0.001202)
10 items 0.000000 0.000000 0.000000 ( 0.000028)
10 items 0.000000 0.000000 0.000000 ( 0.000024)
100 items 0.000000 0.000000 0.000000 ( 0.000147)
100 items 0.000000 0.000000 0.000000 ( 0.000122)
100 items 0.000000 0.000000 0.000000 ( 0.000142)
1000 items 0.000000 0.000000 0.000000 ( 0.001201)
1000 items 0.000000 0.000000 0.000000 ( 0.001233)
1000 items 0.000000 0.000000 0.000000 ( 0.001221)
2000 items 0.010000 0.000000 0.010000 ( 0.002382)
2000 items 0.000000 0.000000 0.000000 ( 0.002353)
2000 items 0.000000 0.000000 0.000000 ( 0.002371)