aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #30961 from q-centrix/performance-improvement-acts-likeRafael França2017-10-231-1/+10
|\ | | | | Performance improvements for acts_like? method
| * Performance improvements for acts_like? method.Dillon Welch2017-10-231-1/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | activesupport/lib/active_support/core_ext/object/acts_like.rb acts_like? Add a case statement to use direct symbols instead of string interpolation for the three scenarios I found in the Rails codebase: time, date, and string. For time/date/string, this change prevents two string allocations for each time the method is called and speeds up the method by ~2.7x. For other arguments, there is no memory difference and performance difference is within margin of error. begin require "bundler/inline" rescue LoadError => e $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" raise e end gemfile(true) do source "https://rubygems.org" gem "rails", github: "rails/rails" gem "arel", github: "rails/arel" gem "benchmark-ips" end def allocate_count GC.disable before = ObjectSpace.count_objects yield after = ObjectSpace.count_objects after.each { |k,v| after[k] = v - before[k] } after[:T_HASH] -= 1 # probe effect - we created the before hash. GC.enable result = after.reject { |k,v| v == 0 } GC.start result end class Object def fast_acts_like?(duck) case duck when :time respond_to? :acts_like_time? when :date respond_to? :acts_like_date? when :string respond_to? :acts_like_string? else respond_to? :"acts_like_#{duck}?" end end end puts puts " acts_like? ".center(80, '=') puts obj = ''.freeze %i(time date string super_hacka).each do |type| puts " #{type} ".center(80, '=') puts " Memory Usage ".center(80, "=") puts puts "value.acts_like?" puts allocate_count { 1000.times { obj.acts_like?(type) } } puts "value.fast_acts_like?" puts allocate_count { 1000.times { obj.fast_acts_like?(type) } } puts puts " Benchmark.ips ".center(80, "=") puts Benchmark.ips do |x| x.report("acts_like?") { obj.acts_like?(type) } x.report("fast_acts_like?") { obj.fast_acts_like?(type) } x.compare! end end ================================== acts_like? ================================== ===================================== time ===================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-1983, :T_STRING=>2052, :T_IMEMO=>1} value.fast_acts_like? {:FREE=>-1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 104.281k i/100ms fast_acts_like? 155.523k i/100ms Calculating ------------------------------------- acts_like? 1.688M (±10.7%) i/s - 8.342M in 5.003804s fast_acts_like? 4.596M (±12.1%) i/s - 22.551M in 5.000124s Comparison: fast_acts_like?: 4596162.4 i/s acts_like?: 1688163.8 i/s - 2.72x slower ===================================== date ===================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-2001, :T_STRING=>2000} value.fast_acts_like? {:FREE=>-1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 85.372k i/100ms fast_acts_like? 166.097k i/100ms Calculating ------------------------------------- acts_like? 1.720M (± 8.3%) i/s - 8.537M in 5.001003s fast_acts_like? 4.695M (±10.1%) i/s - 23.254M in 5.010734s Comparison: fast_acts_like?: 4695493.1 i/s acts_like?: 1719637.9 i/s - 2.73x slower ==================================== string ==================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-2001, :T_STRING=>2000} value.fast_acts_like? {:FREE=>-1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 100.221k i/100ms fast_acts_like? 182.841k i/100ms Calculating ------------------------------------- acts_like? 1.706M (± 7.3%) i/s - 8.519M in 5.022331s fast_acts_like? 3.968M (±22.8%) i/s - 18.650M in 5.006762s Comparison: fast_acts_like?: 3967972.9 i/s acts_like?: 1705773.7 i/s - 2.33x slower ================================= super_hacka ================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-2004, :T_STRING=>2002, :T_SYMBOL=>1} value.fast_acts_like? {:FREE=>-2003, :T_STRING=>2001, :T_SYMBOL=>1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 100.344k i/100ms fast_acts_like? 101.690k i/100ms Calculating ------------------------------------- acts_like? 1.617M (± 7.5%) i/s - 8.128M in 5.055285s fast_acts_like? 1.534M (±10.1%) i/s - 7.627M in 5.031052s Comparison: acts_like?: 1617390.7 i/s fast_acts_like?: 1533897.3 i/s - same-ish: difference falls within error
* | Merge pull request #30953 from rohitpaulk/fix-io-to-jsonRafael Mendonça França2017-10-233-0/+18
|\ \ | | | | | | | | | Fix #to_json for IO objects, fixes #26132
| * | Fix #to_json for unreadable IO objects, fixes #26132Paul Kuruvilla2017-10-233-0/+18
| | |
* | | Merge pull request #30959 from lostapathy/capybara_versionRafael França2017-10-231-0/+2
|\ \ \ | | | | | | | | specify minimum capybara version for system tests
| * | | specify minimum capybara version for system testsJoe Francis2017-10-231-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | Upgraded rails applications may have a Gemfile without a new enough capybara to run system tests. Setting a version here gives the user a more direct error message than they get otherwise. Resolves #30952
* | | | Merge pull request #30920 from lugray/attributes_to_amSean Griffin2017-10-233-0/+376
|\ \ \ \ | | | | | | | | | | Start bringing attributes API to AM
| * | | | Start bringing attributes API to AMLisa Ugray2017-10-183-0/+376
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the first PR of a WIP to bring the attributes API to ActiveModel. It is not yet ready for public API. The `attributes_dirty_test.rb` file was created based on `dirty_test.rb`, and the simplifications in the diff do much to motivate this change. ``` diff activemodel/test/cases/dirty_test.rb activemodel/test/cases/attributes_dirty_test.rb 3a4 > require "active_model/attributes" 5c6 < class DirtyTest < ActiveModel::TestCase --- > class AttributesDirtyTest < ActiveModel::TestCase 7,41c8,12 < include ActiveModel::Dirty < define_attribute_methods :name, :color, :size < < def initialize < @name = nil < @color = nil < @size = nil < end < < def name < @name < end < < def name=(val) < name_will_change! < @name = val < end < < def color < @color < end < < def color=(val) < color_will_change! unless val == @color < @color = val < end < < def size < @size < end < < def size=(val) < attribute_will_change!(:size) unless val == @size < @size = val < end --- > include ActiveModel::Model > include ActiveModel::Attributes > attribute :name, :string > attribute :color, :string > attribute :size, :integer ```
* | | | | Merge pull request #30960 from bogdanvlviv/remove-mentions-of-removed-stuffRafael França2017-10-231-2/+1
|\ \ \ \ \ | |_|/ / / |/| | | | Remove mention about Evented Redis [ci skip]
| * | | | Remove mention about Evented Redis [ci skip]bogdanvlviv2017-10-231-2/+1
|/ / / / | | | | | | | | | | | | | | | | Evented Redis is removed from Rails. See #30945
* | | | Merge pull request #30945 from rafaelfranca/remove-deprecationsRafael França2017-10-2347-758/+144
|\ \ \ \ | | | | | | | | | | Remove deprecations
| * | | | Remove text about deprecation that was already removedRafael Mendonça França2017-10-231-2/+1
| | | | |
| * | | | Remove deprecated `halt_callback_chains_on_return_false` optionRafael Mendonça França2017-10-232-12/+4
| | | | |
| * | | | Remove deprecated `:if` and `:unless` string filter for callbacksRafael Mendonça França2017-10-237-155/+38
| | | | |
| * | | | Change the deprecation horizon of the dynamic routes segment to 6.0Rafael Mendonça França2017-10-231-2/+2
| | | | |
| * | | | Remove deprecated method `#sanitize_conditions`Rafael Mendonça França2017-10-232-2/+4
| | | | |
| * | | | Remove deprecated methd `#scope_chain`Rafael Mendonça França2017-10-233-44/+4
| | | | |
| * | | | Remove deprecated configuration `.error_on_ignored_order_or_limit`Rafael Mendonça França2017-10-233-48/+4
| | | | |
| * | | | Remove deprecated arguments from `#verify!`Rafael Mendonça França2017-10-233-16/+5
| | | | |
| * | | | Remove deprecated argument `name` from `#indexes`Rafael Mendonça França2017-10-237-33/+9
| | | | |
| * | | | Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`Rafael Mendonça França2017-10-233-9/+4
| | | | |
| * | | | Remove deprecated method `supports_primary_key?`Rafael Mendonça França2017-10-233-9/+4
| | | | |
| * | | | Remove deprecated method `supports_migrations?`Rafael Mendonça França2017-10-233-9/+4
| | | | |
| * | | | Remove deprecated methods `initialize_schema_migrations_table` and ↵Rafael Mendonça França2017-10-233-15/+4
| | | | | | | | | | | | | | | | | | | | `initialize_internal_metadata_table`
| * | | | Rase when calling `lock!` in a dirty recordRafael Mendonça França2017-10-233-15/+20
| | | | |
| * | | | Remove deprecated support to passing a class to `:class_name` on associationsRafael Mendonça França2017-10-235-25/+10
| | | | |
| * | | | Remove deprecated argument `default` from `index_name_exists?`Rafael Mendonça França2017-10-234-16/+8
| | | | |
| * | | | Remove deprecated support to `quoted_id` when typecasting an Active Record ↵Rafael Mendonça França2017-10-235-71/+4
| | | | | | | | | | | | | | | | | | | | object
| * | | | Removed deprected evented redis adapterRafael Mendonça França2017-10-234-151/+5
| | | | |
| * | | | Remove deprecated `ActionController::ParamsParser::ParseError`Rafael Mendonça França2017-10-232-7/+6
| | | | |
| * | | | Remove deprecated Erubis ERB handlerRafael Mendonça França2017-10-237-117/+4
| | | | |
* | | | | Merge pull request #30955 from prathamesh-sonpatki/rm-changelog-entryRafael França2017-10-231-7/+0
|\ \ \ \ \ | |/ / / / |/| | | | Remove CHANGELOG entry for the change that was backported to 5-1-stable [ci skip]
| * | | | Remove CHANGELOT entry for the change that was backported to 5-1-stable [ci ↵Prathamesh Sonpatki2017-10-231-7/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | skip] - It was backported in https://github.com/rails/rails/commit/0eae8dd4b859c109919e5da0d6e74ffc6dc8a258 and is present in Rails 5.1.3
* | | | | Fix duplicate aliases when using both INNER/LEFT JOINsRyuta Kamizono2017-10-232-3/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It should be shared the count of alias tracking in both INNER/LEFT JOINs to avoid duplicate aliases. Fixes #30504. Closes #30410.
* | | | | Ensure associations doesn't table name collide with string joinsRyuta Kamizono2017-10-232-4/+11
| |_|/ / |/| | | | | | | | | | | | | | | Currently we have no test for alias tracking with string joins. I've add test case for that to catch a future regression.
* | | | Use the indicative mood consistently [ci skip]George Claghorn2017-10-221-1/+1
| | | |
* | | | Place `MocktailDesigner` in `test/models/drink_designer.rb`Ryuta Kamizono2017-10-233-5/+3
| | | | | | | | | | | | | | | | | | | | Since `MocktailDesigner` inherits `DrinkDesigner` and can not be used alone.
* | | | Fix links [ci skip]George Claghorn2017-10-221-2/+2
| | | |
* | | | Extract metadata from images and videosGeorge Claghorn2017-10-2225-37/+407
| | | |
* | | | Merge pull request #30949 from bogdanvlviv/add-30850-to-changelogEileen M. Uchitelle2017-10-221-0/+7
|\ \ \ \ | | | | | | | | | | Add changelog entry about new `allow_other_host` option for `redirect_back` method
| * | | | Add changelog entry about new `allow_other_host` option for `redirect_back` ↵bogdanvlviv2017-10-221-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | method [ci skip] Related to #30850
* | | | | Merge pull request #30821 from GBH/active-storage-readmeEileen M. Uchitelle2017-10-221-0/+4
|\ \ \ \ \ | | | | | | | | | | | | ActiveStorage install note [skip ci]
| * | | | | how do we install active_storage? [skip ci]Oleg2017-10-061-0/+4
| | | | | |
* | | | | | Merge pull request #29710 from padi/rails-ujs-docsGuillermo Iguaran2017-10-222-0/+25
|\ \ \ \ \ \ | | | | | | | | | | | | | | Adds descriptions to rails-ujs methods [ci skip]
| * | | | | | Adds descriptions to rails-ujs methods [ci skip]Marc Rendl Ignacio2017-07-072-0/+25
| | | | | | |
* | | | | | | Avoid slicing from Thor's original HWIAAkira Matsuda2017-10-221-2/+1
| |_|/ / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Because `options` here is not AS::HWIA but an instance of Thor::CoreExt::HWIA that looks very similar to ours but behaves slightly different, we need to keep this object be an instance of Thor::CoreExt::HWIA. Since Ruby 2.5 has Hash#slice that returns a new Hash instance now, we need to avoid calling `slice` on this tricky object.
* | | | | | [Active Storage] require_relative => requireAkira Matsuda2017-10-211-1/+1
| | | | | |
* | | | | | [Action Cable] require_relative => requireAkira Matsuda2017-10-213-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | This basically reverts f851e1f705f26d8f92f0fc1b265b20bc389d23cb
* | | | | | [Active Job] require_relative => requireAkira Matsuda2017-10-214-13/+13
| | | | | | | | | | | | | | | | | | | | | | | | This basically reverts fef234f1f0a238c2277459652861144ae89501ff
* | | | | | [Action Mailer] require_relative => requireAkira Matsuda2017-10-212-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | This basically reverts cd9cc721ab54e2b0c7875cacf2113f03908a8bb7