diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-01-22 10:46:36 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-22 10:46:36 +0900 |
commit | a19e91f0fab13cca61acdb1f33e27be2323b9786 (patch) | |
tree | 232542abf240f11d86d0dbb4b4d3849b28eba650 /activerecord/lib/active_record/attribute_methods | |
parent | cf1c48478d1f48d763c3bee92d6bc6cfb3e63dba (diff) | |
download | rails-a19e91f0fab13cca61acdb1f33e27be2323b9786.tar.gz rails-a19e91f0fab13cca61acdb1f33e27be2323b9786.tar.bz2 rails-a19e91f0fab13cca61acdb1f33e27be2323b9786.zip |
PERF: Recover `changes_applied` performance (#31698)
#30985 caused `object.save` performance regression since calling
`changes` in `changes_applied` is very slow.
We don't need to call the expensive method in `changes_applied` as long
as `@attributes` is tracked by mutation tracker.
https://gist.github.com/kamipo/1a9f4f3891803b914fc72ede98268aa2
Before:
```
Warming up --------------------------------------
create_string_columns
73.000 i/100ms
Calculating -------------------------------------
create_string_columns
722.256 (± 5.8%) i/s - 3.650k in 5.073031s
```
After:
```
Warming up --------------------------------------
create_string_columns
96.000 i/100ms
Calculating -------------------------------------
create_string_columns
950.224 (± 7.7%) i/s - 4.800k in 5.084837s
```
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods')
-rw-r--r-- | activerecord/lib/active_record/attribute_methods/dirty.rb | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/attribute_methods/dirty.rb b/activerecord/lib/active_record/attribute_methods/dirty.rb index 3de6fe566d..df4c79b0f6 100644 --- a/activerecord/lib/active_record/attribute_methods/dirty.rb +++ b/activerecord/lib/active_record/attribute_methods/dirty.rb @@ -32,9 +32,7 @@ module ActiveRecord # <tt>reload</tt> the record and clears changed attributes. def reload(*) super.tap do - @previously_changed = ActiveSupport::HashWithIndifferentAccess.new @mutations_before_last_save = nil - @attributes_changed_by_setter = ActiveSupport::HashWithIndifferentAccess.new @mutations_from_database = nil end end @@ -114,12 +112,12 @@ module ActiveRecord # Alias for +changed+ def changed_attribute_names_to_save - changes_to_save.keys + mutations_from_database.changed_attribute_names end # Alias for +changed_attributes+ def attributes_in_database - changes_to_save.transform_values(&:first) + mutations_from_database.changed_values end private |