Skip to content

Instantly share code, notes, and snippets.

@splattael
Forked from solnic/type_safe_entity_vs_ar.rb
Last active December 29, 2015 11:57
Show Gist options
  • Save splattael/0003042cce7ba8bac427 to your computer and use it in GitHub Desktop.
Save splattael/0003042cce7ba8bac427 to your computer and use it in GitHub Desktop.
Fetching type-safe entity with rom repo vs AR
Calculating -------------------------------------
type-safe users 273.000 i/100ms
ar user models 257.000 i/100ms
-------------------------------------------------
type-safe users 2.813k (± 1.7%) i/s - 14.196k
ar user models 2.574k (±10.7%) i/s - 12.850k
Comparison:
type-safe users: 2812.7 i/s
ar user models: 2574.2 i/s - 1.09x slower
require 'bundler/inline'
gemfile(install = true) do
source 'https://rubygems.org'
gem 'benchmark-ips'
gem 'activerecord'
gem 'dry-data', github: 'dryrb/dry-data'
gem 'dry-validation', github: 'dryrb/dry-validation'
gem 'rom-sql', github: 'rom-rb/rom-sql'
gem 'rom-repository', github: 'rom-rb/rom-repository'
gem 'sqlite3'
end
require 'benchmark/ips'
require 'dry-data'
require 'dry/data/type/constrained'
require 'rom-sql'
require 'rom-repository'
require 'active_record'
DB_URL = 'sqlite://rom_repository.db'
ActiveRecord::Base.establish_connection(
adapter: "sqlite3",
database: "rom_repository.db"
)
class User < ActiveRecord::Base
end
rom = ROM.container(:sql, DB_URL) do |config|
class Users < ROM::Relation[:sql]
end
config.register_relation(Users)
end
conn = rom.gateways[:default].connection
conn.drop_table?(:users)
conn.create_table :users do
primary_key :id
String :name
end
rom.relation(:users).insert(name: 'Jane')
rom.relation(:users).insert(name: 'Joe')
rom.relation(:users).insert(name: 'Jade')
module Types
end
Dry::Data.configure { |c| c.namespace = Types }
Dry::Data.finalize
module Types
PrimaryKey = Strict::Int.constrained(gt: 0)
Name = Strict::String.constrained(min_size: 3)
end
module Entities
class User < Dry::Data::Struct
attribute :id, Types::PrimaryKey
attribute :name, Types::Name
end
end
class UserRepo < ROM::Repository
relations :users
end
user_repo = UserRepo.new(rom)
users = user_repo.users.as(Entities::User)
Benchmark.ips do |x|
x.report('type-safe users') do
users.to_a
end
x.report('ar user models') do
User.all.to_a
end
x.compare!
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment