1. 21 6月, 2014 3 次提交
  2. 20 6月, 2014 35 次提交
  3. 19 6月, 2014 2 次提交
    • V
      Add `logger.debug?` guard to `ActionMailer::LogSubscriber#process` · 9f6a7962
      Viktar Basharymau 提交于
      *TLDR*: The method is 4 times faster when log level is higher than DEBUG.
      Also, the other two methods, `#deliver` and `#receive` have similar guard statements,
      so this commit adds some symmetry to the code.
      
      This is probably not the most critical part of ActionMailer in terms
      of performance, but here are some benchmarks:
      
      ```
      require 'benchmark/ips'
      require 'action_mailer'
      
      event = ActiveSupport::Notifications::Event.new(
                  'process.action_mailer',
                  Time.now,
                  Time.now,
                  'bf4e2b36ce085fd35b24',
                  { mailer: "UserMailer", action: :welcome }
              )
      
      ActionMailer::Base.logger = ActiveSupport::Logger.new '/dev/null'
      
      subscriber = ActionMailer::LogSubscriber.new
      def subscriber.process_with_guard(event)
        return unless logger.debug?
        mailer = event.payload[:mailer]
        action = event.payload[:action]
        debug("\n#{mailer}##{action}: processed outbound mail in #{event.duration.round(1)}ms")
      end
      
      Benchmark.ips do |r|
        ActionMailer::Base.logger.level = ::Logger::Severity::INFO
        r.report('no guard') { subscriber.process(event) }
        r.report('   guard') { subscriber.process_with_guard(event) }
      end
      
      __END__
      Calculating -------------------------------------
                  no guard      9640 i/100ms
                     guard     38381 i/100ms
      -------------------------------------------------
                  no guard   169166.9 (±10.2%) i/s -     838680 in   5.007262s
                     guard   728184.9 (±9.6%) i/s -    3607814 in   4.999218s
      ```
      
      When log level is DEBUG, the _guarded_ method is a bit slower. This is a
      good tradeoff for 4x improvement in production mode.
      
      ```
      Benchmark.ips do |r|
        ActionMailer::Base.logger.level = ::Logger::Severity::DEBUG
        r.report('no guard') { subscriber.process(event) }
        r.report('   guard') { subscriber.process_with_guard(event) }
      end
      
      __END__
      Calculating -------------------------------------
                  no guard      4970 i/100ms
                     guard      4564 i/100ms
      -------------------------------------------------
                  no guard    55617.4 (±3.5%) i/s -     278320 in   5.010523s
                     guard    49452.1 (±5.6%) i/s -     251020 in   5.093358s
      
      ```
      9f6a7962
    • S
      Further simplify `changed?` conditional for numeric types · 0aecb473
      Sean Griffin 提交于
      `Type::Integer.new.type_cast('') # => nil`, we do not need a special
      case to handle this, `nil => ''` already returns false. The only case we
      need to handle is `0 => 'wibble'` should be changed, while `0 => '0'`
      should not.
      0aecb473