Skip to content

Instantly share code, notes, and snippets.

@vikhyat
Last active August 29, 2015 13:58
Show Gist options
  • Save vikhyat/10017195 to your computer and use it in GitHub Desktop.
Save vikhyat/10017195 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'bundler/setup'
require 'active_model_serializers'
require 'benchmark'
class BadgeType < Struct.new(:id, :name)
include ActiveModel::SerializerSupport
end
class Badge < Struct.new(:id, :name, :badge_type)
include ActiveModel::SerializerSupport
end
class UserBadge < Struct.new(:id, :badge, :granted_by)
include ActiveModel::SerializerSupport
end
class User < Struct.new(:id, :name, :email, :user_badges)
include ActiveModel::SerializerSupport
end
class BadgeTypeSerializer < ActiveModel::Serializer
attributes :id, :name
end
class BadgeSerializer < ActiveModel::Serializer
attributes :id, :name
has_one :badge_type, embed: :ids, include: true
end
class UserBadgeSerializer < ActiveModel::Serializer
attributes :id
has_one :badge, embed: :ids, include: true
has_one :granted_by, embed: :ids, include: true
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :name, :email
has_many :user_badges, embed: :ids, include: true
end
badge_types = []
3.times {|i| badge_types.push BadgeType.new(i, "Badge Type #{i}") }
badges = []
5000.times {|i| badges.push Badge.new(i, "Badge #{i}", badge_types.sample) }
granters = []
5.times {|i| granters.push User.new(i, "Granter #{i}", "granter#{i}@example.com", []) }
user = User.new(5, "User", "[email protected]", [])
user_badges = badges.map.with_index {|x, i| UserBadge.new(i, x, granters.sample) }
user.user_badges = user_badges
puts "AMS version: #{ActiveModel::Serializer::VERSION}"
Benchmark.bmbm do |x|
x.report("serialize badges") { 100.times { ActiveModel::ArraySerializer.new(badges).as_json } }
x.report("serialize user_badges") { 100.times { ActiveModel::ArraySerializer.new(user_badges).as_json } }
x.report("serialize user") { UserSerializer.new(user).as_json }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment