diff options
author | Jon Leighton <j@jonathanleighton.com> | 2012-10-12 12:33:11 +0100 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2012-10-12 12:33:11 +0100 |
commit | f1765019ce9b6292f2264b4601dad5daaffe3a89 (patch) | |
tree | 6e89e88dc5c8f4771f34b3560709fa8096cec4bc /railties/lib/rails/source_annotation_extractor.rb | |
parent | 9e5f7cc62e9ef1e865c6eba28be69e935434f8e6 (diff) | |
download | rails-f1765019ce9b6292f2264b4601dad5daaffe3a89.tar.gz rails-f1765019ce9b6292f2264b4601dad5daaffe3a89.tar.bz2 rails-f1765019ce9b6292f2264b4601dad5daaffe3a89.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.
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 'railties/lib/rails/source_annotation_extractor.rb')
0 files changed, 0 insertions, 0 deletions