aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #21075 from byroot/not-empty-vs-anyRafael Mendonça França2015-07-301-2/+2
|\ | | | | Array#any? is slower and not the inverse of Array#empty?
| * Array#any? is slower and not the inverse of Array#empty?Jean Boussier2015-07-301-2/+2
|/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ``` empty_array = [] small_array = [1] * 30 bigger_array = [1] * 300 Benchmark.ips do |x| x.report('empty !empty?') { !empty_array.empty? } x.report('small !empty?') { !small_array.empty? } x.report('bigger !empty?') { !bigger_array.empty? } x.report('empty any?') { empty_array.any? } x.report('small any?') { small_array.any? } x.report('bigger any?') { bigger_array.any? } end ``` ``` Calculating ------------------------------------- empty !empty? 132.059k i/100ms small !empty? 133.974k i/100ms bigger !empty? 133.848k i/100ms empty any? 106.924k i/100ms small any? 85.525k i/100ms bigger any? 86.663k i/100ms ------------------------------------------------- empty !empty? 8.522M (± 7.9%) i/s - 42.391M small !empty? 8.501M (± 8.5%) i/s - 42.202M bigger !empty? 8.434M (± 8.6%) i/s - 41.894M empty any? 4.161M (± 8.3%) i/s - 20.743M small any? 2.654M (± 5.2%) i/s - 13.256M bigger any? 2.642M (± 6.4%) i/s - 13.173M ``` Ref: https://github.com/rails/rails/pull/21057#discussion_r35902468
* Merge pull request #21057 from schneems/schneems/journey-formatter-objectsRichard Schneeman2015-07-3018-68/+157
|\ | | | | Beyond Ludicrous Speed
| * Use delete_if instead of each; delete(key)schneems2015-07-301-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | It is slightly faster: ``` Calculating ------------------------------------- each; delete 35.166k i/100ms delete_if 36.416k i/100ms ------------------------------------------------- each; delete 478.026k (± 8.5%) i/s - 2.391M delete_if 485.123k (± 7.9%) i/s - 2.440M ```
| * Remove (another) array allocationschneems2015-07-301-5/+14
| | | | | | | | | | | | We don't always need an array when generating a url with the formatter. We can be lazy about allocating the `missing_keys` array. This saves us: 35,606 bytes and 889 objects per request
| * Remove array allocationschneems2015-07-301-2/+2
| | | | | | | | | | | | THe only reason we were allocating an array is to get the "missing_keys" variable in scope of the error message generator. Guess what? Arrays kinda take up a lot of memory, so by replacing that with a nil, we save: 35,303 bytes and 886 objects per request
| * zOMG 37 objects savedschneems2015-07-301-1/+1
| |
| * Don't allocate array when not necessaryschneems2015-07-301-5/+6
| | | | | | | | | | | | In the `tag_options` method an array is used to build up elements, then `Array#*` (which is an alias for `Array#join` is called to turn the array into a string. Instead of allocating an array to build a string, we can build the string we want from the beginning. Saved: 121,743 bytes 893 objects
| * String#freeze optimizationsschneems2015-07-302-2/+2
| |
| * Decrease allocations in transliterateschneems2015-07-301-5/+13
| | | | | | | | | | | | We can save a few objects by freezing the `replacement` string. We save a few more by down-casing the string in memory instead of allocating a new one. We save far more objects by checking for the default separator `"-"`, and using pre-generated regular expressions. We will save 209,231 bytes and 1,322 objects.
| * Avoid hash duplication by skipping mutationschneems2015-07-301-2/+2
| | | | | | | | | | | | If we don't mutate the `recall` hash, then there's no reason to duplicate it. While this change doesn't get rid of that many objects, each hash object it gets rid of was massive. Saves 888 string objects per request, 206,013 bytes (thats 0.2 mb which is kinda a lot).
| * Only allocate new string when neededschneems2015-07-301-1/+7
| | | | | | | | | | | | Instead of calling `sub` on every link_to call for controller, we can detect when the string __needs__ to be allocated and only then create a new string (without the leading slash), otherwise, use the string that is given to us. Saves 888 string objects per request, 35,524 bytes.
| * Freeze a string in comparatorschneems2015-07-301-1/+1
| | | | | | | | Saves 888 string objects per request.
| * Avoid calling to_s on nil in journey/formatterschneems2015-07-301-2/+2
| | | | | | | | | | | | | | | | When `defaults[key]` in `generate` in the journey formatter is called, it often returns a `nil` when we call `to_s` on a nil, it allocates an empty string. We can skip this check when the default value is nil. This change buys us 35,431 bytes of memory and 887 fewer objects per request. Thanks to @matthewd for help with the readability
| * Cut string allocations in content_tag_stringschneems2015-07-296-20/+20
| | | | | | | | | | | | content_tag's first argument is will generate a string with an html tag so `:a` will generate: `<a></a>`. When this happens, the symbol is implicitly `to_s`-d so a new string is allocated. We can get around that by using a frozen string instead which This change buys us 74,236 bytes of memory and 1,855 fewer objects per request.
| * Cut string ActionView template allocationsschneems2015-07-291-2/+7
| | | | | | | | | | | | The instrument method creates new strings, the most common action to instrument is "!render_template` so we can detect when that action is occurring and use a frozen string instead. This change buys us 113,714 bytes of memory and 1,790 fewer objects per request.
| * Optimize hash keyschneems2015-07-291-1/+1
| | | | | | | | | | | | No idea why on earth this hash key isn't already optimized by MRI, but it isn't. :shit: This change buys us 74,077 bytes of memory and 1,852 fewer objects per request.
| * Decrease string allocation in content_tag_stringschneems2015-07-291-6/+7
| | | | | | | | | | | | | | | | | | | | When an unknonwn key is passed to the hash in `PRE_CONTENT_STRINGS` it returns nil, when you call "#{nil}" it allocates a new empty string. We can get around this allocation by using a default value `Hash.new { "".freeze }`. We can avoid the `to_sym` call by pre-populating the hash with a symbol key in addition to a string key. We can freeze some strings when using Array#* to reduce allocations. Array#join can take frozen strings. This change buys us 86,600 bytes of memory and 1,857 fewer objects per request.
| * Reduce hash allocations in route_setschneems2015-07-291-1/+1
| | | | | | | | | | | | | | | | When generating a url with `url_for` the hash of arguments passed in, is dup-d and merged a TON. I wish I could clean this up better, and might be able to do it in the future. This change removes one dup, since it's literally right after we just dup-d the hash to pass into this constructor. This may be a breaking, change but the tests pass...so :shipit: we can revert if it causes problems This change buys us 205,933 bytes of memory and 887 fewer objects per request.
| * Decrease route_set allocationsschneems2015-07-291-3/+7
| | | | | | | | | | | | | | | | In handle_positional_args `Array#-=` is used which allocates a new array. Instead we can iterate through and delete elements, modifying the array in place. Also `Array#take` allocates a new array. We can build the same by iterating over the other element. This change buys us 106,470 bytes of memory and 2,663 fewer objects per request.
| * Speed up journey missing_keysschneems2015-07-291-3/+15
| | | | | | | | | | | | | | | | Most routes have a `route.path.requirements[key]` of `/[-_.a-zA-Z0-9]+\/[-_.a-zA-Z0-9]+/` yet every time this method is called a new regex is generated on the fly with `/\A#{DEFAULT_INPUT}\Z/`. OBJECT ALLOCATIONS BLERG! This change uses a special module that implements `===` so it can be used in a case statement to pull out the default input. When this happens, we use a pre-generated regex. This change buys us 1,643,465 bytes of memory and 7,990 fewer objects per request.
| * Speed up journey extract_parameterized_partsschneems2015-07-291-2/+3
| | | | | | | | | | | | | | | | Micro optimization: `reverse.drop_while` is slower than `reverse_each.drop_while`. This doesn't save any object allocations. Second, `keys_to_keep` is typically a very small array. The operation `parameterized_parts.keys - keys_to_keep` actually allocates two arrays. It is quicker (I benchmarked) to iterate over each and check inclusion in array manually. This change buys us 1774 fewer objects per request
| * Decrease string allocations in url_optionsschneems2015-07-291-1/+5
| | | | | | | | | | | | The request.script_name is dup-d which allocates an extra string. It is most commonly an empty string "". We can save a ton of string allocations by checking first if the string is empty, if so we can use a frozen empty string instead of duplicating an empty string. This change buys us 35,714 bytes of memory and 893 fewer objects per request.
| * Decrease string allocations in apply_inflectionsschneems2015-07-292-5/+36
| | | | | | | | | | | | In `apply_inflections` a string is down cased and some whitespace stripped in the front (which allocate strings). This would normally be fine, however `uncountables` is a fairly small array (10 elements out of the box) and this method gets called a TON. Instead we can keep an array of valid regexes for each uncountable so we don't have to allocate new strings. This change buys us 325,106 bytes of memory and 3,251 fewer objects per request.
| * Decrease string allocations on AR#respond_to?schneems2015-07-291-1/+9
| | | | | | | | | | | | When a symbol is passed in, we call `to_s` on it which allocates a string. The two hardcoded symbols that are used internally are `:to_partial_path` and `:to_model`. This change buys us 71,136 bytes of memory and 1,777 fewer objects per request.
* | Merge pull request #21071 from ↵Kasper Timm Hansen2015-07-301-3/+2
|\ \ | |/ |/| | | | | hedgesky/remove_yepnope_mention_from_form_helpers_guide Remove yepnope mention from form helpers guide because it's deprecated
| * Remove yepnope mention from form helpers guide because it's deprecated [ci skip]Anton Chuchkalov2015-07-301-3/+2
|/
* Merge pull request #21065 from rails/schneems/fix-assets_testRichard Schneeman2015-07-292-0/+2
|\ | | | | Fix tests on master
| * Fix rake/notes_testschneems2015-07-291-0/+1
| | | | | | | | | | | | | | | | | | | | | | Presumably due to https://github.com/rails/sprockets-rails/pull/265 sprockets was trying to load the "scss" gem but it isn't in the gemfile: ``` ApplicationTests::RakeTests::RakeNotesTest#test_register_a_new_extension: LoadError: cannot load such file -- sass ``` If we use an empty precompile list, it won't try to load sass.
| * Fix reported regression rails/sprockets-rails#265schneems2015-07-291-0/+1
|/ | | | We can prevent the UglifierCompressor from being instantiated prematurely by setting precompile to an empty array in this test.
* Merge pull request #21056 from yui-knk/fix/deprecation_silenceRafael Mendonça França2015-07-291-1/+4
|\ | | | | Make silence a warning inserted by commit #4b3f8ac
| * Make silence a warning inserted by commit #4b3f8acyui-knk2015-07-301-1/+4
| |
* | Merge pull request #21054 from yui-knk/fix/doc_field_error_procClaudio B.2015-07-291-1/+1
|\ \ | |/ |/| [ci skip] `field_error_proc` is used in `ActionView::Helpers::ActiveM…
| * [ci skip] `field_error_proc` is used in ↵yui-knk2015-07-291-1/+1
|/ | | | | | `ActionView::Helpers::ActiveModelInstanceTag` so replace `Active Record` with `Active Model`
* Merge pull request #21049 from y-yagi/fix_i18n_validation_testCarlos Antonio da Silva2015-07-281-1/+1
|\ | | | | pass the correct argument to mock on a test of `validates_length_of`
| * pass the correct argument to mock on a test of `validates_length_of`yuuji.yaginuma2015-07-281-1/+1
|/
* Tiny documentation edits [ci skip]Robin Dupret2015-07-283-6/+8
|
* Merge pull request #21048 from yui-knk/fix/guide_about_action_pack2Yves Senn2015-07-281-1/+1
|\ | | | | [ci skip] Add a link to action_controller_overview.html
| * [ci skip] Add a link to action_controller_overview.htmlyui-knk2015-07-281-1/+1
|/
* Merge pull request #21047 from yui-knk/fix/guide_about_action_packRobin Dupret2015-07-281-1/+1
|\ | | | | [ci skip] Now Action View is completely separated from Action Pack
| * [ci skip] Now Action View is completely separated from Action Packyui-knk2015-07-281-1/+1
|/
* Add `:nodoc:` for internal testing methods [ci skip]Robin Dupret2015-07-285-9/+9
|
* Merge pull request #20590 from vngrs/set_default_charsetRafael Mendonça França2015-07-272-6/+13
|\ | | | | Document, refactor and create test case for ActionDispatch::Response
| * Document, refactor and create test case for ↵Mehmet Emin İNAÇ2015-06-172-6/+13
| | | | | | | | ActionDispatch::Response#charset= method
* | Merge pull request #20849 from vngrs/misleading_nested_exceptionsRafael Mendonça França2015-07-275-8/+36
|\ \ | | | | | | Fix misleading errors for has_one through relations
| * | Fix misleading errors for has_one through relationsMehmet Emin İNAÇ2015-07-225-8/+36
| | |
* | | Merge pull request #20759 from vngrs/fix_wrong_docRafael Mendonça França2015-07-271-2/+2
|\ \ \ | | | | | | | | Change wrong usage in documentation about autoload_paths [ci skip]
| * | | Change wrong usage in documentation about autoload_paths [ci skip]Mehmet Emin İNAÇ2015-07-021-2/+2
| | | | | | | | | | | | | | | | We can't use this configuration outside of the application.rb
* | | | Merge pull request #21031 from vngrs/fix_params_wrapper_docRafael Mendonça França2015-07-271-3/+3
|\ \ \ \ | | | | | | | | | | Fix params_wrapper doc [ci skip]
| * | | | Fix params_wrapper doc [ci skip]Mehmet Emin İNAÇ2015-07-261-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This feature also works with `PUT`, `PATCH` and `DELETE` requests. Also developers can add `:url_encoded_form` and `:multipart_form` into the `:format` for wrapping url encoded or multipart form data.