diff options
author | Eugene Kenny <elkenny@gmail.com> | 2017-06-18 15:37:06 +0100 |
---|---|---|
committer | Eugene Kenny <elkenny@gmail.com> | 2017-06-18 15:37:06 +0100 |
commit | c879649a733d982fba9e70f5a280d13636b67c37 (patch) | |
tree | d38d297e300b683df9cc92c17e771d94e9b878f0 /activerecord/test/cases | |
parent | b37aa68ff637c4ce1cfd9f6eaec659bc98a1e1b5 (diff) | |
download | rails-c879649a733d982fba9e70f5a280d13636b67c37.tar.gz rails-c879649a733d982fba9e70f5a280d13636b67c37.tar.bz2 rails-c879649a733d982fba9e70f5a280d13636b67c37.zip |
Improve the performance of writing attributes
Using a similar approach to 08576b94ad4f19dfc368619d7751e211d23dcad8,
this change adds a new internal `_write_attribute` method which bypasses
the code that checks for attribute aliases and custom primary keys.
We can use this method instead of `write_attribute` when we know that we
have the name of the actual column to be updated and not an alias.
This makes writing an attribute with `attribute=` about 18% faster.
Benchmark:
```
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
raise e
end
gemfile(true) do
source "https://rubygems.org"
gem "rails", github: "rails/rails"
gem "arel", github: "rails/arel"
gem "sqlite3"
gem "benchmark-ips"
end
require "active_record"
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
create_table :posts, force: true do |t|
end
end
class Post < ActiveRecord::Base
end
post = Post.new(id: 1)
Benchmark.ips do |x|
x.report("attribute=") { post.id = post.id + 1 }
end
```
Before:
Warming up --------------------------------------
attribute= 25.889k i/100ms
Calculating -------------------------------------
attribute= 290.946k (± 3.1%) i/s - 1.476M in 5.077036s
After:
Warming up --------------------------------------
attribute= 30.056k i/100ms
Calculating -------------------------------------
attribute= 345.088k (± 4.8%) i/s - 1.743M in 5.064264s
Diffstat (limited to 'activerecord/test/cases')
0 files changed, 0 insertions, 0 deletions