Skip to content

Commit 4cc67a4

Browse files
authored
Merge pull request #1292 from simplepractice/memory-profiling
Memory usage improvements
2 parents b9969af + f48798e commit 4cc67a4

File tree

6 files changed

+26
-15
lines changed

6 files changed

+26
-15
lines changed

jsonapi-resources.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
2727
spec.add_development_dependency 'pry'
2828
spec.add_development_dependency 'concurrent-ruby-ext'
2929
spec.add_development_dependency 'database_cleaner'
30+
spec.add_development_dependency 'memory_profiler'
3031
spec.add_dependency 'activerecord', '>= 4.1'
3132
spec.add_dependency 'railties', '>= 4.1'
3233
spec.add_dependency 'concurrent-ruby'

lib/jsonapi/link_builder.rb

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,19 @@ def format_route(route)
105105
end
106106

107107
def formatted_module_path_from_class(klass)
108-
scopes = if @engine
109-
module_scopes_from_class(klass)[1..-1]
110-
else
111-
module_scopes_from_class(klass)
112-
end
113-
114-
unless scopes.empty?
115-
"/#{ scopes.map {|scope| format_route(scope.to_s.underscore)}.compact.join('/') }/"
116-
else
117-
"/"
108+
@_module_path_cache ||= {}
109+
@_module_path_cache[klass] ||= begin
110+
scopes = if @engine
111+
module_scopes_from_class(klass)[1..-1]
112+
else
113+
module_scopes_from_class(klass)
114+
end
115+
116+
unless scopes.empty?
117+
"/#{ scopes.map {|scope| format_route(scope.to_s.underscore)}.compact.join('/') }/"
118+
else
119+
"/"
120+
end
118121
end
119122
end
120123

lib/jsonapi/resource.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ module JSONAPI
55
class Resource
66
include Callbacks
77

8+
DEFAULT_ATTRIBUTE_OPTIONS = { format: :default }.freeze
9+
MODULE_PATH_REGEXP = /::[^:]+\Z/.freeze
10+
811
attr_reader :context
912

1013
define_jsonapi_resources_callbacks :create,
@@ -555,7 +558,7 @@ def attribute(attribute_name, options = {})
555558
end
556559

557560
def default_attribute_options
558-
{ format: :default }
561+
DEFAULT_ATTRIBUTE_OPTIONS
559562
end
560563

561564
def relationship(*attrs)
@@ -1133,7 +1136,7 @@ def module_path
11331136
if name == 'JSONAPI::Resource'
11341137
''
11351138
else
1136-
name =~ /::[^:]+\Z/ ? ($`.freeze.gsub('::', '/') + '/').underscore : ''
1139+
name =~ MODULE_PATH_REGEXP ? ($`.freeze.gsub('::', '/') + '/').underscore : ''
11371140
end
11381141
end
11391142

lib/jsonapi/resource_serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@ def relationships_hash(source, fetchable_fields, include_directives = {})
287287
include_linkage = ia && ia[:include]
288288
include_linked_children = ia && !ia[:include_related].empty?
289289

290-
options = { filters: ia && ia[:include_filters] || {} }
291290
if field_set.include?(name)
292291
ro = relationship_object(source, relationship, include_linkage)
293292
hash[format_key(name)] = ro unless ro.blank?
@@ -300,6 +299,7 @@ def relationships_hash(source, fetchable_fields, include_directives = {})
300299
resources = if source.preloaded_fragments.has_key?(format_key(name))
301300
source.preloaded_fragments[format_key(name)].values
302301
else
302+
options = { filters: ia && ia[:include_filters] || {} }
303303
[source.public_send(name, options)].flatten(1).compact
304304
end
305305
resources.each do |resource|

test/benchmark/request_benchmark.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ def setup
77
end
88

99
def bench_large_index_request_uncached
10-
10.times do
10+
100.times do
1111
assert_jsonapi_get '/api/v2/books?include=bookComments,bookComments.author'
1212
end
1313
end
1414

1515
def bench_large_index_request_caching
1616
cache = ActiveSupport::Cache::MemoryStore.new
1717
with_resource_caching(cache) do
18-
10.times do
18+
100.times do
1919
assert_jsonapi_get '/api/v2/books?include=bookComments,bookComments.author'
2020
end
2121
end

test/test_helper.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
require 'minitest/mock'
2525
require 'jsonapi-resources'
2626
require 'pry'
27+
require 'memory_profiler'
2728

2829
require File.expand_path('../helpers/value_matchers', __FILE__)
2930
require File.expand_path('../helpers/assertions', __FILE__)
@@ -639,6 +640,9 @@ def self.run_one_method(klass, method_name, reporter)
639640
end
640641
end
641642
puts
643+
if ENV["MEMORY_PROFILER"]
644+
MemoryProfiler.report(allow_files: 'lib/jsonapi') { super(klass, method_name, reporter) }.pretty_print
645+
end
642646
end
643647
end
644648

0 commit comments

Comments
 (0)