mirror of https://github.com/rails/rails
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:
parent
17922930c3
commit
b474d06d5e
|
@ -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|
|
||||
|
|
Loading…
Reference in New Issue