Skip to content

Commit

Permalink
Updating benchmarks and profiling into the mother of all performance …
Browse files Browse the repository at this point in the history
…scripts
  • Loading branch information
durran committed Jun 29, 2011
1 parent 482a95f commit a81d07d
Show file tree
Hide file tree
Showing 4 changed files with 540 additions and 89 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Expand Up @@ -16,5 +16,6 @@ doc/*
*.un~
*~
*.rbc
mongoid_prof*
perf/reports
*.profile
*.profile.pdf
*.symbols
304 changes: 227 additions & 77 deletions perf/benchmark.rb
Expand Up @@ -20,6 +20,10 @@ class Person
references_many :posts, :validate => false
references_one :game, :validate => false
references_and_referenced_in_many :preferences, :validate => false

index [[ "_id", Mongo::ASCENDING ], [ "addresses._id", Mongo::ASCENDING ]]
index [[ "_id", Mongo::ASCENDING ], [ "name._id", Mongo::ASCENDING ]]
index "preference_ids"
end

class Name
Expand Down Expand Up @@ -57,145 +61,291 @@ class Post
field :title, :type => String
field :content, :type => String
referenced_in :person

index "person_id"
end

class Game
include Mongoid::Document

field :name, :type => String
referenced_in :person

index "person_id"
end

class Preference
include Mongoid::Document

field :name, :type => String
references_and_referenced_in_many :people

index "person_ids"
end

puts "Creating indexes..."

[ Person, Post, Game, Preference ].each(&:create_indexes)

puts "Starting benchmark..."

Benchmark.bm do |bm|

bm.report("[ root ] #create [ 1,000,000 ]") do
1000000.times do |n|
Person.create(:birth_date => Date.new(1970, 1, 1))
end
end
puts "\n[ Root Document Benchmarks ]"

bm.report("[ root ] #each [ 1,000,000 ]") do
Person.all.each { |person| person.birth_date }
end
[ 1000, 10000, 100000, 1000000 ].each do |i|

bm.report("[ root ] #update_attribute [ 1,000,000 ]") do
Person.all.each { |person| person.update_attribute(:title, "Updated") }
end
puts "[ #{i} ]"

person = Person.first
bm.report("#create ") do
i.times do |n|
Person.create(:birth_date => Date.new(1970, 1, 1))
end
end

bm.report("[ emb:one-to-many ] #build [ 1000 ]") do
1000.times do |n|
person.addresses.build(
:street => "Wienerstr. #{n}",
:city => "Berlin",
:post_code => "10999"
)
bm.report("#each ") do
Person.all.each { |person| person.birth_date }
end
end

bm.report("[ emb:one-to-many ] #clear [ 1000 ]") do
person.addresses.clear
end
bm.report("#save ") do
Person.all.each do |person|
person.title = "Testing"
person.save
end
end

bm.report("[ emb:one-to-many ] #create [ 1000 ]") do
1000.times do |n|
person.addresses.create(
:street => "Wienerstr. #{n}",
:city => "Berlin",
:post_code => "10999"
)
bm.report("#update_attribute ") do
Person.all.each { |person| person.update_attribute(:title, "Updated") }
end
end

bm.report("[ emb:one-to-many ] #count [ 1000 ]") do
person.addresses.count
Person.delete_all
end

bm.report("[ emb:one-to-many ] #delete_all [ 1000 ]") do
person.addresses.delete_all
end
person = Person.create(:birth_date => Date.new(1970, 1, 1))

puts "\n[ Embedded 1-n Benchmarks ]"

bm.report("[ emb:one-to-many ] #push [ 1000 ]") do
1000.times do |n|
person.addresses.push(
Address.new(
[ 1000, 10000 ].each do |i|

puts "[ #{i} ]"

bm.report("#build ") do
i.times do |n|
person.addresses.build(
:street => "Wienerstr. #{n}",
:city => "Berlin",
:post_code => "10999"
)
)
end
end
end

bm.report("[ emb:one-to-many ] #update_attribute [ 1000 ]") do
person.addresses.each do |address|
address.update_attribute(:address_type, "Home")
bm.report("#clear ") do
person.addresses.clear
end
end

address = person.addresses.last
bm.report("#create ") do
i.times do |n|
person.addresses.create(
:street => "Wienerstr. #{n}",
:city => "Berlin",
:post_code => "10999"
)
end
end

bm.report("[ emb:one-to-many ] #find [ 1000 ]") do
person.addresses.find(address.id)
end
bm.report("#count ") do
person.addresses.count
end

bm.report("[ emb:one-to-many ] #delete [ 1000 ]") do
person.addresses.delete(address)
end
bm.report("#delete_all ") do
person.addresses.delete_all
end

person.addresses.delete_all
bm.report("#push ") do
i.times do |n|
person.addresses.push(
Address.new(
:street => "Wienerstr. #{n}",
:city => "Berlin",
:post_code => "10999"
)
)
end
end

bm.report("[ emb:one-to-one ] Changing out 1k embedded documents") do
1000.times do |n|
person.name = Name.new(:given => "Name #{n}")
bm.report("#save ") do
person.addresses.each do |address|
address.address_type = "Work"
address.save
end
end
end

bm.report("[ ref:one-to-many ] Appending 100k referenced documents") do
100000.times do |n|
person.posts.create(:title => "Posting #{n}")
bm.report("#update_attribute ") do
person.addresses.each do |address|
address.update_attribute(:address_type, "Home")
end
end

address = person.addresses.last

bm.report("#find ") do
person.addresses.find(address.id)
end

bm.report("#delete ") do
person.addresses.delete(address)
end

person.addresses.delete_all
end

bm.report("[ ref:one-to-many ] Updating 100k referenced documents") do
person.posts.each do |post|
post.update_attribute(:content, "My first post")
puts "\n[ Embedded 1-1 Benchmarks ]"

[ 1000, 10000 ].each do |i|

puts "[ #{i} ]"

bm.report("#relation= ") do
i.times do |n|
person.name = Name.new(:given => "Name #{n}")
end
end
end

bm.report("[ ref:one-to-many ] Deleting 100k referenced documents") do
puts "\n[ Referenced 1-n Benchmarks ]"

[ 1000, 10000, 100000 ].each do |i|

puts "[ #{i} ]"

bm.report("#build ") do
i.times do |n|
person.posts.build(:title => "Posting #{n}")
end
end

bm.report("#clear ") do
person.posts.clear
end

bm.report("#create ") do
i.times do |n|
person.posts.create(:title => "Posting #{n}")
end
end

bm.report("#count ") do
person.posts.count
end

bm.report("#delete_all ") do
person.posts.delete_all
end

bm.report("#push ") do
i.times do |n|
person.posts.push(Post.new(:title => "Posting #{n}"))
end
end

bm.report("#save ") do
person.posts.each do |post|
post.content = "Test"
post.save
end
end

bm.report("#update_attribute ") do
person.posts.each do |post|
post.update_attribute(:content, "Testing")
end
end

post = person.posts.last

bm.report("#find ") do
person.posts.find(post.id)
end

bm.report("#delete ") do
person.posts.delete(post)
end

person.posts.delete_all
end

bm.report("[ ref:one-to-one ] Changing out 100k referenced documents") do
100000.times do |n|
person.game = Game.new(:name => "Final Fantasy #{n}")
puts "\n[ Referenced 1-1 Benchmarks ]"

[ 1000, 10000, 100000 ].each do |i|

puts "[ #{i} ]"

bm.report("#relation= ") do
i.times do |n|
person.name = Game.new(:name => "Final Fantasy #{n}")
end
end
end

bm.report("[ ref:many-to-many ] Appending 10k referenced documents") do
10000.times do |n|
person.preferences.create(:name => "Setting #{n}")
puts "\n[ Referenced n-n Benchmarks ]"

[ 1000, 10000 ].each do |i|

puts "[ #{i} ]"

bm.report("#build ") do
i.times do |n|
person.preferences.build(:name => "Preference #{n}")
end
end
end

bm.report("[ ref:many-to-many ] Updating 10k referenced documents") do
person.preferences.each do |preference|
preference.update_attribute(:name, "Updated")
bm.report("#clear ") do
person.preferences.clear
end

bm.report("#create ") do
i.times do |n|
person.preferences.create(:name => "Preference #{n}")
end
end

bm.report("#count ") do
person.preferences.count
end

bm.report("#delete_all ") do
person.preferences.delete_all
end

bm.report("#push ") do
i.times do |n|
person.preferences.push(Preference.new(:name => "Preference #{n}"))
end
end

bm.report("#save ") do
person.preferences.each do |preference|
preference.name = "Test"
preference.save
end
end

bm.report("#update_attribute ") do
person.preferences.each do |preference|
preference.update_attribute(:name, "Testing")
end
end

preference = person.preferences.last

bm.report("#find ") do
person.preferences.find(preference.id)
end

bm.report("#delete ") do
person.preferences.delete(preference)
end
end

bm.report("[ ref:many-to-many ] Deleting 10k referenced documents") do
person.preferences.delete_all
end
end

0 comments on commit a81d07d

Please sign in to comment.