Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'benchmark'
- require 'active_record'
- # $ docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres:9.6
- # $ psql -h localhost -U postgres -d postgres
- ActiveRecord::Base.establish_connection(
- adapter: 'postgresql',
- encoding: 'unicode',
- host: 'localhost',
- database: 'postgres',
- username: 'postgres',
- password: 'password',
- )
- MEMBER_SIZE = 100
- KEYS = Array.new(MEMBER_SIZE, &:to_s)
- VALUE = 'a' * 100
- Type = Struct.new('Type', *KEYS)
- ActiveRecord::Base.connection.create_table(:benchmark, id: false, force: true) do |t|
- MEMBER_SIZE.times { |i| t.string i.to_s }
- end
- class Model < ActiveRecord::Base
- self.table_name = 'benchmark'
- end
- hash = KEYS.each_with_object({}) { |k, m| m[k] = VALUE }
- struct = Type.new(*KEYS)
- ar = Model.new(hash)
- N = 100_000
- Benchmark.bm(20) do |x|
- x.report('Hash') do
- N.times do
- KEYS.each { |key| hash[key] }
- end
- end
- x.report('Struct') do
- N.times do
- KEYS.each { |key| struct[key] }
- end
- end
- x.report('ActiveRecord') do
- N.times do
- KEYS.each { |key| ar[key] }
- end
- end
- end
- SIZE = 10_000
- puts ''
- puts '### Array<Hash> 10,000'
- puts ''
- puts `ps u #{$$}`
- array_hash = Array.new(SIZE) { KEYS.each_with_object({}) { |k, m| m[k] = VALUE } }
- puts `ps u #{$$}`
- puts ''
- puts '### Array<Struct> 10,000'
- puts ''
- puts `ps u #{$$}`
- array_struct = Array.new(SIZE) { Type.new(*KEYS) }
- puts `ps u #{$$}`
- puts ''
- puts '### Array<ActiveRecord::Base> 10,000'
- puts ''
- puts `ps u #{$$}`
- array_ar = Array.new(SIZE) { Model.new(hash) }
- puts `ps u #{$$}`
- __END__
- ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
- user system total real
- Hash 1.055541 0.000745 1.056286 ( 1.057475)
- Struct 1.994870 0.002425 1.997295 ( 2.003269)
- ActiveRecord 8.106248 0.009364 8.115612 ( 8.150399)
- ### Array<Hash> 10,000
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- koshigoe 35281 100.0 0.6 4506992 99012 ?? Ss 7:32AM 0:11.53 benchmark-hash-vs-struct-vs-ar.rb
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- koshigoe 35281 100.0 0.8 4505968 138700 ?? Ss 7:32AM 0:11.88 benchmark-hash-vs-struct-vs-ar.rb
- ### Array<Struct> 10,000
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- koshigoe 35281 100.0 0.8 4505968 138700 ?? Ss 7:32AM 0:11.89 benchmark-hash-vs-struct-vs-ar.rb
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- koshigoe 35281 100.0 0.9 4520304 146052 ?? Ss 7:32AM 0:11.90 benchmark-hash-vs-struct-vs-ar.rb
- ### Array<ActiveRecord::Base> 10,000
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- koshigoe 35281 100.0 0.9 4520304 146052 ?? Ss 7:32AM 0:11.90 benchmark-hash-vs-struct-vs-ar.rb
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- koshigoe 35281 100.0 2.5 4788280 412972 ?? Ss 7:32AM 0:18.81 benchmark-hash-vs-struct-vs-ar.rb
Add Comment
Please, Sign In to add comment