Skip to content

Commit 22bea15

Browse files
minsikzzangshishirmk
authored andcommitted
Add jsonapi-rb test to benchmark suite
1 parent 4ccd40a commit 22bea15

2 files changed

Lines changed: 64 additions & 61 deletions

File tree

spec/lib/object_serializer_performance_spec.rb

Lines changed: 43 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -38,56 +38,52 @@
3838
# end
3939
# end
4040

41-
def print_stats(message, count, ams_time, our_time)
41+
def print_stats(message, count, ams_time, jsonapi_time, our_time)
4242
format = '%-15s %-10s %s'
4343
puts ''
4444
puts message
4545
puts format(format, 'Serializer', 'Records', 'Time')
4646
puts format(format, 'AMS serializer', count, ams_time.round(2).to_s + ' ms')
47+
puts format(format, 'jsonapi-rb serializer', count, jsonapi_time.round(2).to_s + ' ms')
4748
puts format(format, 'Fast serializer', count, our_time.round(2).to_s + ' ms')
4849
end
4950

50-
def run_hash_benchmark(message, movie_count, our_serializer, ams_serializer)
51+
def run_hash_benchmark(message, movie_count, our_serializer, ams_serializer, jsonapi_serializer)
5152
our_time = Benchmark.measure { our_hash = our_serializer.serializable_hash }.real * 1000
5253
ams_time = Benchmark.measure { ams_hash = ams_serializer.as_json }.real * 1000
53-
print_stats(message, movie_count, ams_time, our_time)
54+
jsonapi_time = Benchmark.measure { ams_hash = jsonapi_serializer.to_hash }.real * 1000
55+
56+
print_stats(message, movie_count, ams_time, jsonapi_time, our_time)
5457
end
5558

56-
def run_json_benchmark(message, movie_count, our_serializer, ams_serializer)
59+
def run_json_benchmark(message, movie_count, our_serializer, ams_serializer, jsonapi_serializer)
5760
our_json = nil
5861
ams_json = nil
62+
jsonapi_json = nil
5963
our_time = Benchmark.measure { our_json = our_serializer.serialized_json }.real * 1000
6064
ams_time = Benchmark.measure { ams_json = ams_serializer.to_json }.real * 1000
61-
print_stats(message, movie_count, ams_time, our_time)
62-
return our_json, ams_json
65+
jsonapi_time = Benchmark.measure { jsonapi_json = jsonapi_serializer.to_json }.real * 1000
66+
67+
print_stats(message, movie_count, ams_time, jsonapi_time, our_time)
68+
return our_json, ams_json, jsonapi_json
6369
end
6470

6571
context 'when comparing with AMS 0.10.x' do
66-
#[1, 25, 250, 1000].each do |movie_count|
67-
[1].each do |movie_count|
72+
[1, 25, 250, 1000].each do |movie_count|
6873
speed_factor = 25
6974
it "should serialize #{movie_count} records atleast #{speed_factor} times faster than AMS" do
7075
ams_movies = build_ams_movies(movie_count)
71-
jsonapi_movies = build_jsonapi_movies(movie_count)
7276
movies = build_movies(movie_count)
77+
jsonapi_movies = build_jsonapi_movies(movie_count)
7378
our_serializer = MovieSerializer.new(movies)
7479
ams_serializer = ActiveModelSerializers::SerializableResource.new(ams_movies)
75-
76-
puts JSONAPI::Serializable::Renderer.new.render(
77-
jsonapi_movies,
78-
class: {
79-
JSONAPIMovie: JSONAPIMovieSerializer,
80-
JSONAPIActor: JSONAPIActorSerializer,
81-
JSONAPIUser: JSONAPIUserSerializer,
82-
JSONAPIMovieType: JSONAPIMovieTypeSerializer
83-
},
84-
).to_json
80+
jsonapi_serializer = JSONAPISerializer.new(jsonapi_movies)
8581

8682
message = "Serialize to JSON string #{movie_count} records"
87-
our_json, ams_json = run_json_benchmark(message, movie_count, our_serializer, ams_serializer)
83+
our_json, ams_json, jsonapi_json = run_json_benchmark(message, movie_count, our_serializer, ams_serializer, jsonapi_serializer)
8884

8985
message = "Serialize to Ruby Hash #{movie_count} records"
90-
run_hash_benchmark(message, movie_count, our_serializer, ams_serializer)
86+
run_hash_benchmark(message, movie_count, our_serializer, ams_serializer, jsonapi_serializer)
9187

9288
expect(our_json.length).to eq ams_json.length
9389
expect { our_serializer.serialized_json }.to perform_faster_than { ams_serializer.to_json }.at_least(speed_factor).times
@@ -96,44 +92,30 @@ def run_json_benchmark(message, movie_count, our_serializer, ams_serializer)
9692
end
9793
end
9894

99-
# context 'when comparing with AMS 0.10.x and with includes and meta' do
100-
# #[1, 25, 250, 1000].each do |movie_count|
101-
# [2].each do |movie_count|
102-
# speed_factor = 25
103-
# it "should serialize #{movie_count} records atleast #{speed_factor} times faster than AMS" do
104-
# ams_movies = build_ams_movies(movie_count)
105-
# movies = build_movies(movie_count)
106-
# options = {}
107-
# options[:meta] = { total: movie_count }
108-
# options[:include] = [:actors, :movie_type]
109-
# our_serializer = MovieSerializer.new(movies, options)
110-
# ams_serializer = ActiveModelSerializers::SerializableResource.new(ams_movies, include: options[:include], meta: options[:meta])
111-
#
112-
# message = "Serialize to JSON string #{movie_count} with includes and meta"
113-
# our_json, ams_json = run_json_benchmark(message, movie_count, our_serializer, ams_serializer)
114-
#
115-
# puts our_json
116-
# puts ams_json
117-
#
118-
# jsonapi_movies = build_jsonapi_movies(movie_count)
119-
# puts JSONAPI::Serializable::Renderer.new.render(
120-
# jsonapi_movies,
121-
# class: {
122-
# JSONAPIMovie: JSONAPIMovieSerializer,
123-
# JSONAPIActor: JSONAPIActorSerializer,
124-
# JSONAPIUser: JSONAPIUserSerializer,
125-
# JSONAPIMovieType: JSONAPIMovieTypeSerializer
126-
# },
127-
# include: options[:include]
128-
# ).to_json
129-
#
130-
# message = "Serialize to Ruby Hash #{movie_count} with includes and meta"
131-
# run_hash_benchmark(message, movie_count, our_serializer, ams_serializer)
132-
#
133-
# expect(our_json.length).to eq ams_json.length
134-
# expect { our_serializer.serialized_json }.to perform_faster_than { ams_serializer.to_json }.at_least(speed_factor).times
135-
# expect { our_serializer.serializable_hash }.to perform_faster_than { ams_serializer.as_json }.at_least(speed_factor).times
136-
# end
137-
# end
138-
# end
95+
context 'when comparing with AMS 0.10.x and with includes and meta' do
96+
[1, 25, 250, 1000].each do |movie_count|
97+
speed_factor = 25
98+
it "should serialize #{movie_count} records atleast #{speed_factor} times faster than AMS" do
99+
ams_movies = build_ams_movies(movie_count)
100+
movies = build_movies(movie_count)
101+
jsonapi_movies = build_jsonapi_movies(movie_count)
102+
options = {}
103+
options[:meta] = { total: movie_count }
104+
options[:include] = [:actors, :movie_type]
105+
our_serializer = MovieSerializer.new(movies, options)
106+
ams_serializer = ActiveModelSerializers::SerializableResource.new(ams_movies, include: options[:include], meta: options[:meta])
107+
jsonapi_serializer = JSONAPISerializer.new(jsonapi_movies, include: options[:include], meta: options[:meta])
108+
109+
message = "Serialize to JSON string #{movie_count} with includes and meta"
110+
our_json, ams_json = run_json_benchmark(message, movie_count, our_serializer, ams_serializer, jsonapi_serializer)
111+
112+
message = "Serialize to Ruby Hash #{movie_count} with includes and meta"
113+
run_hash_benchmark(message, movie_count, our_serializer, ams_serializer, jsonapi_serializer)
114+
115+
expect(our_json.length).to eq ams_json.length
116+
expect { our_serializer.serialized_json }.to perform_faster_than { ams_serializer.to_json }.at_least(speed_factor).times
117+
expect { our_serializer.serializable_hash }.to perform_faster_than { ams_serializer.as_json }.at_least(speed_factor).times
118+
end
119+
end
120+
end
139121
end

spec/shared/contexts/jsonapi_context.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,27 @@ class JSONAPIMovieTypeSerializer < JSONAPI::Serializable::Resource
4141
type 'movie_type'
4242
attributes :name
4343
end
44+
45+
class JSONAPISerializer
46+
def initialize(data, options = {})
47+
@serializer = JSONAPI::Serializable::Renderer.new
48+
@options = options.merge(class: {
49+
JSONAPIMovie: JSONAPIMovieSerializer,
50+
JSONAPIActor: JSONAPIActorSerializer,
51+
JSONAPIUser: JSONAPIUserSerializer,
52+
JSONAPIMovieType: JSONAPIMovieTypeSerializer
53+
})
54+
@data = data
55+
end
56+
57+
def to_json
58+
@serializer.render(@data, @options).to_json
59+
end
60+
61+
def to_hash
62+
@serializer.render(@data, @options)
63+
end
64+
end
4465
end
4566

4667
after :context do

0 commit comments

Comments
 (0)