From f172129256e17899c19502b5494fa975c8ff2bbe Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Sun, 28 Mar 2021 11:10:24 +0900 Subject: [PATCH] Call `self.class` only once in `init_internals` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calling `self.class` multiple times is not cheap. ```ruby class A def self.foo end def foo1 self.class.foo self.class.foo self.class.foo self.class.foo end def foo2 klass = self.class klass.foo klass.foo klass.foo klass.foo end end a = A.new Benchmark.ips do |x| x.report("foo1") { a.foo1 } x.report("foo2") { a.foo2 } end ``` ``` Warming up -------------------------------------- foo1 341.701k i/100ms foo2 414.000k i/100ms Calculating ------------------------------------- foo1 3.194M (± 5.4%) i/s - 16.060M in 5.044653s foo2 4.276M (± 3.8%) i/s - 21.528M in 5.041999s ``` Similar with #36052. --- activerecord/lib/active_record/core.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index cf7ffbe1f0..17c8279c01 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -837,17 +837,20 @@ module ActiveRecord end def init_internals - @primary_key = self.class.primary_key @readonly = false @previously_new_record = false @destroyed = false @marked_for_destruction = false @destroyed_by_association = nil @_start_transaction_state = nil - @strict_loading = self.class.strict_loading_by_default - @strict_loading_mode = self.class.strict_loading_mode - self.class.define_attribute_methods + klass = self.class + + @primary_key = klass.primary_key + @strict_loading = klass.strict_loading_by_default + @strict_loading_mode = klass.strict_loading_mode + + klass.define_attribute_methods end def initialize_internals_callback