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 /guides/code/getting_started/test/functional | |
| 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 'guides/code/getting_started/test/functional')
0 files changed, 0 insertions, 0 deletions
