# frozen_string_literal: true require 'benchmark/ips' require 'switch_point' require 'active_record' SwitchPoint.configure do |config| config.define_switch_point :proxy, readonly: :proxy_readonly, writable: :proxy_writable end class Plain < ActiveRecord::Base end class Proxy1 < ActiveRecord::Base use_switch_point :proxy end class ProxyBase < ActiveRecord::Base self.abstract_class = true use_switch_point :proxy end class Proxy2 < ProxyBase end database_config = { adapter: 'sqlite3', database: ':memory:' } ActiveRecord::Base.configurations = { 'default' => database_config.dup, 'proxy_readonly' => database_config.dup, 'proxy_writable' => database_config.dup, } ActiveRecord::Base.establish_connection(:default) Plain.connection.execute('CREATE TABLE plains (id integer primary key autoincrement)') %i[readonly writable].each do |mode| ProxyBase.public_send("with_#{mode}") do %w[proxy1s proxy2s].each do |table| ProxyBase.connection.execute("CREATE TABLE #{table} (id integer primary key autoincrement)") end end end Benchmark.ips do |x| x.report('plain') do Plain.create Plain.first end x.report('proxy1') do Proxy1.with_writable { Proxy1.create } Proxy1.first end x.report('proxy2') do Proxy2.with_writable { Proxy2.create } Proxy2.first end x.compare! end