aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2013-12-12 18:40:21 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2013-12-12 18:53:32 -0700
commitb474d06d5ea646c8145b07c8acbf1181c9e0b2aa (patch)
treed51b795e6d73b4c1c44c466ceda4a7463520ba40
parent17922930c384e22bb4b37523b1b5f4db2137c134 (diff)
downloadrails-b474d06d5ea646c8145b07c8acbf1181c9e0b2aa.tar.gz
rails-b474d06d5ea646c8145b07c8acbf1181c9e0b2aa.tar.bz2
rails-b474d06d5ea646c8145b07c8acbf1181c9e0b2aa.zip
Perf: save ~9% of object allocations on heavy requests.
The per-thread registry is keyed on the class name, and each request for the class name returns a new string. This is in the hot path for a lot of Active Record behavior, so we easily accumulate thousands of repeated strings. To fix, we simply cache the key when the class is first extended with the module. TODO: Eliminate this module. The per-thread instance concept is common, but this technique confuses and obfuscates.
-rw-r--r--activesupport/lib/active_support/per_thread_registry.rb7
1 files changed, 5 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/per_thread_registry.rb b/activesupport/lib/active_support/per_thread_registry.rb
index a5e7389d16..ca2e4d5625 100644
--- a/activesupport/lib/active_support/per_thread_registry.rb
+++ b/activesupport/lib/active_support/per_thread_registry.rb
@@ -32,12 +32,15 @@ module ActiveSupport
#
# If the class has an initializer, it must accept no arguments.
module PerThreadRegistry
+ def self.extended(object)
+ object.instance_variable_set '@per_thread_registry_key', object.name.freeze
+ end
+
def instance
- Thread.current[name] ||= new
+ Thread.current[@per_thread_registry_key] ||= new
end
protected
-
def method_missing(name, *args, &block) # :nodoc:
# Caches the method definition as a singleton method of the receiver.
define_singleton_method(name) do |*a, &b|