diff options
author | Jon Leighton <j@jonathanleighton.com> | 2012-10-12 12:33:11 +0100 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2012-11-21 21:59:09 +0000 |
commit | ae934aef4af05f21d231015485cbc5a96df7a4d6 (patch) | |
tree | baebbe216e0cdf23c91f2572e20379b335a3b594 /activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb | |
parent | 96106a1493f755d1ed90250f9a98c5fcb600a6cc (diff) | |
download | rails-ae934aef4af05f21d231015485cbc5a96df7a4d6.tar.gz rails-ae934aef4af05f21d231015485cbc5a96df7a4d6.tar.bz2 rails-ae934aef4af05f21d231015485cbc5a96df7a4d6.zip |
Don't allocate new strings in compiled attribute methods
This improves memory and performance without having to use symbols which
present DoS problems. Thanks @headius and @tenderlove for the
suggestion.
This was originally committed in
f1765019ce9b6292f2264b4601dad5daaffe3a89, and then reverted in
d3494903719682abc0948bef290af0d3d7b5a440 due to it causing problems in a
real application. This second attempt should solve that.
Benchmark
---------
require 'active_record'
require 'benchmark/ips'
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
class Post < ActiveRecord::Base
connection.create_table :posts, force: true do |t|
t.string :name
end
end
post = Post.create name: 'omg'
Benchmark.ips do |r|
r.report('Post.new') { Post.new name: 'omg' }
r.report('post.name') { post.name }
r.report('post.name=') { post.name = 'omg' }
r.report('Post.find(1).name') { Post.find(1).name }
end
Before
------
Calculating -------------------------------------
Post.new 1419 i/100ms
post.name 7538 i/100ms
post.name= 3024 i/100ms
Post.find(1).name 243 i/100ms
-------------------------------------------------
Post.new 20637.6 (±12.7%) i/s - 102168 in 5.039578s
post.name 1167897.7 (±18.2%) i/s - 5186144 in 4.983077s
post.name= 64305.6 (±9.6%) i/s - 317520 in 4.998720s
Post.find(1).name 2678.8 (±10.8%) i/s - 13365 in 5.051265s
After
-----
Calculating -------------------------------------
Post.new 1431 i/100ms
post.name 7790 i/100ms
post.name= 3181 i/100ms
Post.find(1).name 245 i/100ms
-------------------------------------------------
Post.new 21308.8 (±12.2%) i/s - 105894 in 5.053879s
post.name 1534103.8 (±2.1%) i/s - 7634200 in 4.979405s
post.name= 67441.0 (±7.5%) i/s - 337186 in 5.037871s
Post.find(1).name 2681.9 (±10.6%) i/s - 13475 in 5.084511s
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb')
0 files changed, 0 insertions, 0 deletions