spec/benchmarks.rb in rack-reducer-1.0.1 vs spec/benchmarks.rb in rack-reducer-1.1.0
- old
+ new
@@ -1,41 +1,71 @@
-require_relative 'spec_helper'
-require 'sinatra/base'
+require 'rack'
+require 'pry'
require 'json'
+require_relative '../lib/rack/reducer'
require 'benchmark/ips'
+require_relative 'fixtures'
+require 'sequel'
-Conditionals = lambda do |params = {}|
+DB = Sequel.sqlite.tap do |db|
+ db.create_table(:artists) do
+ primary_key :id
+ String :name
+ String :genre
+ Integer :release_count
+ end
+ Fixtures::DB[:artists].each { |row| db[:artists].insert(row) }
+end
+
+conditional_app = lambda do |env|
+ params = Rack::Request.new(env).params
@artists = DB[:artists]
- if (genre = params[:genre])
- @artists = @artists.grep(:genre, "%#{genre}%", case_insensitive: true)
+ if (genre = params['genre'])
+ @artists = @artists.where(genre: genre.to_s)
end
- if (name = params[:name])
+ if (name = params['name'])
@artists = @artists.grep(:name, "%#{name}%", case_insensitive: true)
end
-
- @artists.to_json
+ Rack::Response.new(@artists).finish
end
-Reduction = lambda do |params = {}|
- @artists = Rack::Reducer.call(params, dataset: DB[:artists], filters: [
- ->(genre:) { grep(:genre, "%#{genre}%", case_insensitive: true) },
- ->(name:) { grep(:name, "%#{name}%", case_insensitive: true) },
- ])
+TestReducer = Rack::Reducer.create(
+ DB[:artists],
+ ->(genre:) { where(genre: genre.to_s) },
+ ->(name:) { grep(:name, "%#{name}%", case_insensitive: true) },
+)
- @artists.to_json
+reducer_app = lambda do |env|
+ params = Rack::Request.new(env).params
+ @artists = TestReducer.apply(params)
+ Rack::Response.new(@artists).finish
end
-Benchmark.ips(3) do |bm|
- bm.report('conditionals, empty params') { Conditionals.call }
+Benchmark.ips do |bm|
+ env = {
+ 'REQUEST_METHOD' => 'GET',
+ 'PATH_INFO' => '/',
+ 'rack.input' => StringIO.new('')
+ }
- bm.report('reduction, empty params') { Reduction.call }
+ query = {
+ 'QUERY_STRING' => 'name=blake&genre=electronic',
+ }
- bm.report('conditionals, full params') do
- Conditionals.call({ name: 'blake', genre: 'electric' })
+ bm.report('Conditionals (full)') do
+ conditional_app.call env.merge(query)
end
- bm.report('reduction, full params') do
- Reduction.call({ name: 'blake', genre: 'electric' })
+ bm.report('Reducer (full)') do
+ reducer_app.call env.merge(query)
+ end
+
+ bm.report('Conditionals (empty)') do
+ conditional_app.call env.dup
+ end
+
+ bm.report('Reducer (empty)') do
+ reducer_app.call env.dup
end
bm.compare!
end