From b7e2bc06eda51f51386b62aade8ba073a1f089d5 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Mon, 18 Apr 2016 09:31:38 -0500 Subject: [PATCH 1/2] Memoize resource relationships bin/bench_regression "version": "0.10.0.rc5", "rails_version": "4.2.6", "benchmark_run[environment]": "2.2.2p95", perf/only_calc_associations_once "commit_hash": "1e7c428", caching on: caching serializers: gc off 741.7702402782281/ips; 1355 objects caching on: non-caching serializers: gc off 712.3752615532874/ips; 1257 objects caching off: caching serializers: gc off 706.0789199312495/ips; 1355 objects caching off: non-caching serializers: gc off 751.5310710635379/ips; 1257 objects master "commit_hash": "1033b711c7d7c231bb5b832e7dfe7f99389f22c4" caching on: caching serializers: gc off 567.7959835633892/ips; 1803 objects caching on: non-caching serializers: gc off 776.4929551133658/ips; 1257 objects caching off: caching serializers: gc off 538.046851190591/ips; 1803 objects caching off: non-caching serializers: gc off 738.5596630209004/ips; 1257 objects --- lib/active_model_serializers/adapter/attributes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_model_serializers/adapter/attributes.rb b/lib/active_model_serializers/adapter/attributes.rb index 50e958f1..cc8b807b 100644 --- a/lib/active_model_serializers/adapter/attributes.rb +++ b/lib/active_model_serializers/adapter/attributes.rb @@ -34,7 +34,7 @@ module ActiveModelSerializers def resource_relationships(options) relationships = {} serializer.associations(@include_tree).each do |association| - relationships[association.key] = relationship_value_for(association, options) + relationships[association.key] ||= relationship_value_for(association, options) end relationships From e554ba23d204d7075a2727e2ce1b85ca42ced0eb Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Mon, 18 Apr 2016 09:55:27 -0500 Subject: [PATCH 2/2] Nicer debug; compare caching by serializer, grouped by caching on/off bundle exec bin/bench_regression a5eaf6cd7a7fed42d9e64777753a1762e187eadc 1033b711c7d7c231bb5b832e7dfe7f99389f22c4 --pattern bm_caching ["perf/only_calc_associations_once", "a5eaf6cd7a7fed42d9e64777753a1762e187eadc", "1033b711c7d7c231bb5b832e7dfe7f99389f22c4", "a5eaf6c"] "version": "0.10.0.rc5", "rails_version": "4.2.6", "benchmark_run[environment]": "2.2.2p95", Note: checking out 'a5eaf6cd7a7fed42d9e64777753a1762e187eadc'. HEAD is now at a5eaf6c... Nicer debug; compare caching by serializer, grouped by caching on/off caching on: caching serializers: gc off 783.6956866669746/ips; 1355 objects caching on: non-caching serializers: gc off 798.8629770532652/ips; 1257 objects caching off: caching serializers: gc off 682.3661326140281/ips; 1355 objects caching off: non-caching serializers: gc off 721.2175067555897/ips; 1257 objects HEAD is now at 1033b71... Merge pull request #1638 from bf4/caching_redux caching on: caching serializers: gc off 570.6905948477781/ips; 1803 objects caching on: non-caching serializers: gc off 822.8418206976623/ips; 1257 objects caching off: caching serializers: gc off 523.4174806572001/ips; 1803 objects caching off: non-caching serializers: gc off 747.6026493097758/ips; 1257 objects --- test/benchmark/bm_caching.rb | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/test/benchmark/bm_caching.rb b/test/benchmark/bm_caching.rb index c2abbc65..887c3139 100644 --- a/test/benchmark/bm_caching.rb +++ b/test/benchmark/bm_caching.rb @@ -35,6 +35,14 @@ class ApiAssertion get("/non_caching/#{on_off}") end + def debug(msg = '') + if block_given? && ENV['DEBUG'] =~ /\Atrue|on|0\z/i + STDERR.puts yield + else + STDERR.puts msg + end + end + private def assert_responses(caching, non_caching) @@ -85,33 +93,21 @@ class ApiAssertion STDERR.puts message unless ENV['SUMMARIZE'] end end - - def debug(msg = '') - if block_given? && ENV['DEBUG'] =~ /\Atrue|on|0\z/i - STDERR.puts yield - else - STDERR.puts msg - end - end end assertion = ApiAssertion.new assertion.valid? -# STDERR.puts assertion.get_status +assertion.debug { assertion.get_status } time = 10 { 'caching on: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'on'] }, - # 'caching on: caching serializers: gc on' => { disable_gc: false, send: [:get_caching, 'on'] }, - 'caching off: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'off'] }, - # 'caching off: caching serializers: gc on' => { disable_gc: false, send: [:get_caching, 'off'] }, 'caching on: non-caching serializers: gc off' => { disable_gc: true, send: [:get_non_caching, 'on'] }, - # 'caching on: non-caching serializers: gc on' => { disable_gc: false, send: [:get_non_caching, 'on'] }, + 'caching off: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'off'] }, 'caching off: non-caching serializers: gc off' => { disable_gc: true, send: [:get_non_caching, 'off'] } - # 'caching off: non-caching serializers: gc on' => { disable_gc: false, send: [:get_non_caching, 'off'] } }.each do |label, options| assertion.clear Benchmark.ams(label, time: time, disable_gc: options[:disable_gc]) do assertion.send(*options[:send]) end - # STDERR.puts assertion.get_status(options[:send][-1]) + assertion.debug { assertion.get_status(options[:send][-1]) } end