diff options
| author | Aaron Patterson <aaron.patterson@gmail.com> | 2015-08-18 15:12:35 -0700 | 
|---|---|---|
| committer | Aaron Patterson <aaron.patterson@gmail.com> | 2015-08-18 15:12:44 -0700 | 
| commit | 01d88953e2b4049c0a13f6f2343403bd71696b31 (patch) | |
| tree | b0e095cf60b0eb503fc8e09a0b6bbedb79c175b6 /guides/source/caching_with_rails.md | |
| parent | a31686021b127f2586588a7569f08f17296e66d3 (diff) | |
| download | rails-01d88953e2b4049c0a13f6f2343403bd71696b31.tar.gz rails-01d88953e2b4049c0a13f6f2343403bd71696b31.tar.bz2 rails-01d88953e2b4049c0a13f6f2343403bd71696b31.zip | |
drop string allocations for each resource
Eagerly calculate and cache the name of Symbol objects in the path AST.
This drops about 26 string allocations per resource:
```ruby
require 'action_pack'
require 'action_dispatch'
require 'benchmark/ips'
route_set = ActionDispatch::Routing::RouteSet.new
routes = ActionDispatch::Routing::Mapper.new route_set
ObjectSpace::AllocationTracer.setup(%i{path line type})
result = ObjectSpace::AllocationTracer.trace do
  500.times do
    routes.resources :foo
  end
end
sorted = ObjectSpace::AllocationTracer.allocated_count_table.sort_by(&:last)
sorted.each do |k,v|
  next if v == 0
  p k => v
end
__END__
Before:
{:T_SYMBOL=>11}
{:T_REGEXP=>17}
{:T_STRUCT=>6500}
{:T_MATCH=>12004}
{:T_OBJECT=>99009}
{:T_DATA=>116084}
{:T_HASH=>122015}
{:T_STRING=>172647}
{:T_IMEMO=>371132}
{:T_ARRAY=>433056}
After:
{:T_SYMBOL=>11}
{:T_REGEXP=>17}
{:T_STRUCT=>6500}
{:T_MATCH=>12004}
{:T_OBJECT=>99009}
{:T_DATA=>100088}
{:T_HASH=>122015}
{:T_STRING=>159637}
{:T_IMEMO=>363134}
{:T_ARRAY=>433056}
```
Diffstat (limited to 'guides/source/caching_with_rails.md')
0 files changed, 0 insertions, 0 deletions
