1. 01 10月, 2014 1 次提交
  2. 29 9月, 2014 3 次提交
    • E
      Use Hash#each_key instead of Hash#keys.each · e2b49b20
      Erik Michaels-Ober 提交于
      Hash#keys.each allocates an array of keys; Hash#each_key iterates through the
      keys without allocating a new array. This is the reason why Hash#each_key
      exists.
      e2b49b20
    • B
      Remove defunct ivars · 588c321e
      Ben Woosley 提交于
      @column_names_with_alias, @dynamic_methods_hash, @time_zone_column_names, and @cached_time_zone
      588c321e
    • P
      Reduce allocations when running AR callbacks. · 796cab45
      Pete Higgins 提交于
      Inspired by @tenderlove's work in
      c363fff2, this reduces the number of
      strings allocated when running callbacks for ActiveRecord instances. I
      measured that using this script:
      
      ```
      require 'objspace'
      require 'active_record'
      require 'allocation_tracer'
      
      ActiveRecord::Base.establish_connection adapter: "sqlite3",
                                              database: ":memory:"
      
      ActiveRecord::Base.connection.instance_eval do
        create_table(:articles) { |t| t.string :name }
      end
      
      class Article < ActiveRecord::Base; end
      a = Article.create name: "foo"
      a = Article.find a.id
      
      N = 10
      result = ObjectSpace::AllocationTracer.trace do
        N.times { Article.find a.id }
      end
      
      result.sort.each do |k,v|
        p k => v
      end
      puts "total: #{result.values.map(&:first).inject(:+)}"
      ```
      
      When I run this against master and this branch I get this output:
      
      ```
      pete@balloon:~/projects/rails/activerecord$ git checkout master
      M Gemfile
      Switched to branch 'master'
      pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_before
      pete@balloon:~/projects/rails/activerecord$ git checkout remove-dynamic-send-on-built-in-callbacks
      M Gemfile
      Switched to branch 'remove-dynamic-send-on-built-in-callbacks'
      pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_after
      pete@balloon:~/projects/rails/activerecord$ diff allocations_before allocations_after
      39d38
      <
      {["/home/pete/projects/rails/activesupport/lib/active_support/callbacks.rb",
      81]=>[40, 0, 0, 0, 0, 0]}
      42c41
      < total: 630
      ---
      > total: 590
      
      ```
      
      In addition to this, there are two micro-optimizations present:
      
      * Using `block.call if block` vs `yield if block_given?` when the block was being captured already.
      
      ```
      pete@balloon:~/projects$ cat benchmark_block_call_vs_yield.rb
      require 'benchmark/ips'
      
      def block_capture_with_yield &block
        yield if block_given?
      end
      
      def block_capture_with_call &block
        block.call if block
      end
      
      def no_block_capture
        yield if block_given?
      end
      
      Benchmark.ips do |b|
        b.report("block_capture_with_yield") { block_capture_with_yield }
        b.report("block_capture_with_call") { block_capture_with_call }
        b.report("no_block_capture") { no_block_capture }
      end
      pete@balloon:~/projects$ ruby benchmark_block_call_vs_yield.rb
      Calculating -------------------------------------
      block_capture_with_yield
                              124979 i/100ms
      block_capture_with_call
                              138340 i/100ms
          no_block_capture    136827 i/100ms
      -------------------------------------------------
      block_capture_with_yield
                            5703108.9 (±2.4%) i/s -   28495212 in   4.999368s
      block_capture_with_call
                            6840730.5 (±3.6%) i/s -   34169980 in   5.002649s
          no_block_capture  5821141.4 (±2.8%) i/s -   29144151 in   5.010580s
      ```
      
      * Defining and calling methods instead of using send.
      
      ```
      pete@balloon:~/projects$ cat benchmark_method_call_vs_send.rb
      require 'benchmark/ips'
      
      class Foo
        def tacos
          nil
        end
      end
      
      my_foo = Foo.new
      
      Benchmark.ips do |b|
        b.report('send') { my_foo.send('tacos') }
        b.report('call') { my_foo.tacos }
      end
      pete@balloon:~/projects$ ruby benchmark_method_call_vs_send.rb
      Calculating -------------------------------------
                      send     97736 i/100ms
                      call    151142 i/100ms
      -------------------------------------------------
                      send  2683730.3 (±2.8%) i/s -   13487568 in   5.029763s
                      call  8005963.9 (±2.7%) i/s -   40052630 in   5.006604s
      ```
      
      The result of this is making typical ActiveRecord operations slightly faster:
      
      https://gist.github.com/phiggins/e46e51dcc7edb45b5f98
      796cab45
  3. 28 9月, 2014 1 次提交
    • R
      Follow up to #16613 · 1fac7b79
      Robin Dupret 提交于
      Since we want this flag to be enabled anytime we are running the tests
      under JRuby, let's enable this at the Rakefile level so people get the
      performance boost on their local checkout.
      
      Moreover, we avoid having to update this particular line anytime the
      option changes on the JRuby side.
      
      The only drawback is that we have to define it in every Rakefile but
      there's no big deal, this is already the case for other options.
      1fac7b79
  4. 27 9月, 2014 3 次提交
    • P
      Fix typo in AR changelog · 739eee67
      Prathamesh Sonpatki 提交于
      - middlware -> middleware
      739eee67
    • A
      some object allocation reduction for new AR objects · c363fff2
      Aaron Patterson 提交于
      Benchmark:
      
      ```ruby
      require 'objspace'
      require 'active_record'
      
      ActiveRecord::Base.establish_connection adapter: "sqlite3",
                                              database: ":memory:"
      
      ActiveRecord::Base.connection.instance_eval do
        create_table(:articles) { |t| t.string :name }
      end
      
      class Article < ActiveRecord::Base; end
      a = Article.create name: "foo"
      a = Article.find a.id
      
      N = 10
      ObjectSpace::AllocationTracer.trace do
        N.times { Article.find a.id }
      end
      ObjectSpace::AllocationTracer.allocated_count_table
      table.sort_by { |_,x| x }.each do |k,v|
        p k => (v / N)
      end
      ```
      c363fff2
    • R
      Preparing for 4.2.0.beta2 release · 4581d044
      Rafael Mendonça França 提交于
      4581d044
  5. 23 9月, 2014 6 次提交
  6. 22 9月, 2014 1 次提交
  7. 21 9月, 2014 1 次提交
  8. 20 9月, 2014 4 次提交
  9. 19 9月, 2014 2 次提交
  10. 18 9月, 2014 3 次提交
  11. 17 9月, 2014 4 次提交
  12. 15 9月, 2014 1 次提交
  13. 11 9月, 2014 10 次提交