Skip to content

Instantly share code, notes, and snippets.

@sudoremo
Created October 12, 2016 09:19
Show Gist options
  • Select an option

  • Save sudoremo/ac164943975df102af6798ece234eb40 to your computer and use it in GitHub Desktop.

Select an option

Save sudoremo/ac164943975df102af6798ece234eb40 to your computer and use it in GitHub Desktop.
Performance benchmark script for new implementation proposal of `Class#class_attribute`
begin
require 'bundler/inline'
rescue LoadError => e
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
fail e
end
gemfile(true) do
source 'https://rubygems.org'
gem 'rails'
gem 'benchmark-ips'
end
require 'active_support'
require 'active_support/core_ext/object/blank'
require 'minitest/autorun'
require 'benchmark/ips'
class Parent
class_attribute :parent_attr
end
class Mid < Parent
class_attribute :mid_attr
end
class Child1 < Mid
end
class Child2 < Mid
end
class BugTest < Minitest::Test
def test_class_attribute
assert Parent.parent_attr.nil?
assert Mid.parent_attr.nil?
assert Child1.parent_attr.nil?
assert Child2.parent_attr.nil?
Parent.parent_attr = true
assert Parent.parent_attr
assert Mid.parent_attr
assert Child1.parent_attr
assert Child2.parent_attr
Parent.parent_attr = false
assert Parent.parent_attr == false
assert Mid.parent_attr == false
assert Child1.parent_attr == false
assert Child2.parent_attr == false
Mid.parent_attr = true
assert Parent.parent_attr == false
assert Mid.parent_attr
assert Child1.parent_attr
assert Child2.parent_attr
Mid.mid_attr = []
assert Mid.mid_attr == []
assert Child1.mid_attr == []
assert Child2.mid_attr == []
Child1.mid_attr << 1
assert Mid.mid_attr.include?(1)
assert Child1.mid_attr.include?(1)
assert Child2.mid_attr.include?(1)
Child1.mid_attr += [2]
Mid.mid_attr = []
assert Mid.mid_attr == []
assert Child1.mid_attr.include?(1)
assert Child1.mid_attr.include?(2)
assert Child2.mid_attr == []
Child2.mid_attr << 5
assert Mid.mid_attr.include?(5)
assert !Child1.mid_attr.include?(5)
assert Child2.mid_attr.include?(5)
object = Class.new { class_attribute :setting, instance_accessor: true }.new
Benchmark.ips do |x|
x.report('reading low class attribute') { Child1.parent_attr }
x.report('reading high class attribute') { Parent.parent_attr }
x.report('writing low class attribute') { Child1.parent_attr = rand }
x.report('writing high class attribute') { Parent.parent_attr = rand }
Child1.parent_attr = 1
Parent.parent_attr = 1
x.report('r+w low class attribute') { Child1.parent_attr += 1 }
x.report('r+w high class attribute') { Parent.parent_attr += 1 }
x.report('reading instance') { object.setting }
x.report('writing instance') { object.setting = rand }
end
end
def inspect_all
puts "P.p: #{Parent.parent_attr}"
puts "M.p: #{Mid.parent_attr}"
puts "C1.p: #{Child1.parent_attr}"
puts "C2.p: #{Child2.parent_attr}"
puts "M.m: #{Mid.mid_attr}"
puts "C1.m: #{Child1.mid_attr}"
puts "C2.m: #{Child2.mid_attr}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment