aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/http/url.rb
Commit message (Collapse)AuthorAgeFilesLines
* Freeze string literals when not mutated.schneems2015-07-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I wrote a utility that helps find areas where you could optimize your program using a frozen string instead of a string literal, it's called [let_it_go](https://github.com/schneems/let_it_go). After going through the output and adding `.freeze` I was able to eliminate the creation of 1,114 string objects on EVERY request to [codetriage](codetriage.com). How does this impact execution? To look at memory: ```ruby require 'get_process_mem' mem = GetProcessMem.new GC.start GC.disable 1_114.times { " " } before = mem.mb after = mem.mb GC.enable puts "Diff: #{after - before} mb" ``` Creating 1,114 string objects results in `Diff: 0.03125 mb` of RAM allocated on every request. Or 1mb every 32 requests. To look at raw speed: ```ruby require 'benchmark/ips' number_of_objects_reduced = 1_114 Benchmark.ips do |x| x.report("freeze") { number_of_objects_reduced.times { " ".freeze } } x.report("no-freeze") { number_of_objects_reduced.times { " " } } end ``` We get the results ``` Calculating ------------------------------------- freeze 1.428k i/100ms no-freeze 609.000 i/100ms ------------------------------------------------- freeze 14.363k (± 8.5%) i/s - 71.400k no-freeze 6.084k (± 8.1%) i/s - 30.450k ``` Now we can do some maths: ```ruby ips = 6_226k # iterations / 1 second call_time_before = 1.0 / ips # seconds per iteration ips = 15_254 # iterations / 1 second call_time_after = 1.0 / ips # seconds per iteration diff = call_time_before - call_time_after number_of_objects_reduced * diff * 100 # => 0.4530373333993266 miliseconds saved per request ``` So we're shaving off 1 second of execution time for every 220 requests. Is this going to be an insane speed boost to any Rails app: nope. Should we merge it: yep. p.s. If you know of a method call that doesn't modify a string input such as [String#gsub](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37) please [give me a pull request to the appropriate file](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37), or open an issue in LetItGo so we can track and freeze more strings. Keep those strings Frozen ![](https://www.dropbox.com/s/z4dj9fdsv213r4v/let-it-go.gif?dl=1)
* Fix handling of empty X_FORWARDED_HOST header.adam2015-03-201-1/+1
| | | | | | Previously, an empty X_FORWARDED_HOST header would cause Actiondispatch::Http:URL.raw_host_with_port to return nil, causing Actiondispatch::Http:URL.host to raise a NoMethodError.
* drop string allocations per model url_for call in viewsAaron Patterson2015-03-011-1/+1
| | | | | | | | | | | | ```ruby article = Article.new.tap(&:save!) view.url_for article result = ObjectSpace::AllocationTracer.trace do 3000.times { view.url_for article } end p ObjectSpace::AllocationTracer.allocated_count_table[:T_STRING] / 3000 ```
* Add docs for ActionDispatch::Http::URL methodsclaudiob2014-12-181-0/+109
| | | | | | | | | | Add docs for `extract_domain`, `extract_subdomains`, `extract_subdomain`. Add doc examples for `url`, `protocol`, `raw_host_with_port`, `host`, `host_with_port`, `port`, `standard_port`, `standard_port?`, `optional_port`, `port_string`. [ci skip]
* Anchor should not be appended when set to nil/false.Guo Xiang Tan2014-11-231-1/+3
| | | | Fixes https://github.com/rails/rails/issues/17714.
* Realign assignments :scissors:Carlos Antonio da Silva2014-07-311-5/+5
|
* Do not reassign variable when mutation is happeningCarlos Antonio da Silva2014-07-311-8/+5
| | | | | These methods mutate the path variable/argument so there is no need to reassign it every time.
* Only concatenate path if it was given rather than converting blindlyCarlos Antonio da Silva2014-07-311-1/+1
|
* Rename variable to better show its intentCarlos Antonio da Silva2014-07-311-12/+12
|
* Simplify conditionalCarlos Antonio da Silva2014-07-311-3/+2
|
* Push options check up so we can simplify internal methodsCarlos Antonio da Silva2014-07-311-13/+10
|
* use a strategy object for generating urls in named helpersAaron Patterson2014-07-171-8/+13
| | | | | | since we know that the route should be a path or fully qualified, we can pass a strategy object that handles generation. This allows us to eliminate an "if only_path" branch when generating urls.
* extract path building to a methodAaron Patterson2014-07-161-9/+11
|
* break out path building logic to methodsAaron Patterson2014-07-161-14/+22
|
* only extract :params from the options hash onceAaron Patterson2014-07-161-3/+2
|
* push host / port / protocol extraction upAaron Patterson2014-06-301-6/+6
| | | | Then we only need to extract host once.
* add both branches to the only_path conditionalAaron Patterson2014-06-191-6/+6
|
* only check named_host? once in normalize_hostAaron Patterson2014-06-121-3/+7
|
* lookup subdomain from the options hash once, defaulting to trueAaron Patterson2014-06-121-2/+2
| | | | | if the subdomain wasn't specified, it's the same as if specifying :subdomain as `true`, so we can default the value to `true` safely.
* only extract domain from the options hash onceAaron Patterson2014-06-121-3/+4
|
* reduce calls to `named_host?`Aaron Patterson2014-06-121-2/+6
| | | | | `normalize_host` already calls `named_host?`, so there is no reason to test `named_host?` again in the `extract_domain` method.
* Removed warning actionpack url.rbJuanito Fatas2014-06-121-2/+2
| | | | | | | | | | Before: /Users/Juan/dev/rails/actionpack/lib/action_dispatch/http/url.rb:95: warning: shadowing outer local variable - port After: No warning
* remove useless to_param callAaron Patterson2014-06-111-1/+1
| | | | | extract_subdomain always returns a string, and to_param calls to_s on a string
* only look up the subdomain onceAaron Patterson2014-06-111-3/+4
|
* scheme should contain one or more charactersAaron Patterson2014-06-111-1/+1
|
* pull the port out of the options hash onceAaron Patterson2014-06-111-2/+3
|
* remove useless nil checkAaron Patterson2014-06-111-2/+2
| | | | | | | | | irb(main):004:0> /foo/ !~ nil => true irb(main):005:0> /foo/ !~ 'bar' => true irb(main):006:0> /foo/ !~ 'foo' => false
* these methods are always called with a tld_parameterAaron Patterson2014-06-111-3/+3
| | | | | remove the default parameter since the methods are always called with a parameter
* rm `same_host?`. The same conditional is two lines down.Aaron Patterson2014-06-111-5/+3
|
* Revert "rm `same_host?`. The same conditional is two lines down."Aaron Patterson2014-06-111-5/+8
| | | | This reverts commit 79469b4b0c05a50e19699bc9b568042add2d4987.
* rm `same_host?`. The same conditional is two lines down.Aaron Patterson2014-06-111-8/+5
|
* cache host on the stack so we only look it up onceAaron Patterson2014-06-111-8/+9
|
* only pull :protocol from the options hash onceAaron Patterson2014-06-111-2/+3
|
* cache protocol on the stack to reduce options hash lookupsAaron Patterson2014-06-111-7/+7
|
* eliminate nil checks in normalize_portAaron Patterson2014-06-111-7/+7
|
* reduce hash lookups and disconnect normalize_port from the options hashAaron Patterson2014-06-111-9/+9
|
* Merge pull request #14986 from dlangevin/trailing-slash-url-generationRafael Mendonça França2014-05-241-7/+13
|\ | | | | | | | | | | | | Fixes URL generation with trailing_slash: true Conflicts: actionpack/lib/action_dispatch/http/url.rb
| * Fixes URL generation with trailing_slash: trueDan Langevin2014-05-221-9/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | URL generation with trailing_slash: true was adding a trailing slash after .:format Routes.draw do resources :bars end bars_url(trailing_slash: true, format: 'json') # => /bars.json/ This commit removes that extra trailing slash
* | fewer string allocations per url_forAaron Patterson2014-05-201-7/+5
| |
* | mutate the path string to avoid object allocationsAaron Patterson2014-05-201-4/+4
| |
* | push only_path conditional upAaron Patterson2014-05-201-18/+19
| |
* | push arg checking upAaron Patterson2014-05-201-4/+4
| |
* | fewer method calls and string garbage when there is no user/passwordAaron Patterson2014-05-201-9/+5
| |
* | Always use the provided port for protocol relative urlsAndrew White2014-05-111-0/+2
| | | | | | | | | | There may be situations where you need to tunnel SSL connections over port 80 so we shouldn't remove it if it has been explicitly provided.
* | ActionDispatch::Http::URL.normalize_port should not strip port for protocol ↵Guilherme Cavalcanti2014-05-111-2/+0
| | | | | | | | relative URL.
* | skip dealing with params if none are providedAaron Patterson2014-05-091-4/+11
| | | | | | | | | | | | | | | | | | | | | | This lets us avoid 1. A slow call to Hash#slice 2. An is_a? test 3. Extra hash allocations (from slice) 4. String allocations etc.
* | don't mutate the options hash, so we don't have to dupAaron Patterson2014-05-091-4/+3
| | | | | | | | avoids extra hash allocations on each call
* | use unless and || since these options are booleanAaron Patterson2014-05-091-1/+1
|/
* Refactor ActionDispatch::Http::URL.build_host_urlAndrew White2013-04-181-20/+49
| | | | | Add support for extracting the port from the :host option and for removing the subdomain by using nil, false or ''.
* Duplicate options before mutating themAndrew White2013-04-181-0/+1
|