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.
This commit is contained in:
Jeremy Kemper 2013-12-12 18:40:21 -07:00
parent 17922930c3
commit b474d06d5e
1 changed files with 5 additions and 2 deletions

View File

@ -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|