1. 26 4月, 2016 1 次提交
  2. 25 4月, 2016 3 次提交
  3. 24 4月, 2016 8 次提交
  4. 23 4月, 2016 3 次提交
  5. 22 4月, 2016 2 次提交
  6. 21 4月, 2016 4 次提交
    • X
      restores code comments in String#blank? [ci skip] · 0f8eefa6
      Xavier Noria 提交于
      When you come here without context, it is important to hightlight that
      checking the predicate is worthwhile due to the observation that blank
      strings are often empty. So you complicate the code (which has a cost
      in terms of readability and aesthetics), but statistically makes sense.
      
      Then, you also need to explain why the second operand is so convoluted.
      
      Otherwise, you wonder why this line is written precisely this way. That
      is what code comments are for.
      0f8eefa6
    • T
      Update delegate to use newer Ruby syntax · 406047d3
      Todd Lynam 提交于
      This commit updates `delegate` to use the keyword argument syntax added in Ruby 2. I left the `ArgumentError` when `to` is missing, because it better explains how to correctly use `delegate`.  We could instead rely on the default `ArgumentError` that would be raised if `to` were a required keyword argument.
      406047d3
    • R
      Remove unused `BLANK_RE` · c7617c71
      Ryuta Kamizono 提交于
      Follow up to #24658.
      c7617c71
    • S
      Speed up String#blank? Regex · 54243fec
      schneems 提交于
      Follow up on https://github.com/rails/rails/commit/697384df36a939e565b7c08725017d49dc83fe40#commitcomment-17184696.
      
      The regex to detect a blank string `/\A[[:space:]]*\z/` will loop through every character in the string to ensure that all of them are a `:space:` type. We can invert this logic and instead look for any non-`:space:` characters. When that happens, we would return on the first character found and the regex engine does not need to keep looking.
      
      Thanks @nellshamrell for the regex talk at LSRC.
      
      By defining a "blank" string as any string that does not have a non-whitespace character (yes, double negative) we can get a substantial speed bump.
      
      Also an inline regex is (barely) faster than a regex in a constant, since it skips the constant lookup. A regex literal is frozen by default.
      
      ```ruby
      require 'benchmark/ips'
      
      def string_generate
        str = " abcdefghijklmnopqrstuvwxyz\t".freeze
        str[rand(0..(str.length - 1))] * rand(0..23)
      end
      
      strings = 100.times.map { string_generate }
      
      ALL_WHITESPACE_STAR = /\A[[:space:]]*\z/
      
      Benchmark.ips do |x|
        x.report('current regex            ') { strings.each {|str| str.empty? || ALL_WHITESPACE_STAR === str } }
        x.report('+ instead of *           ') { strings.each {|str| str.empty? || /\A[[:space:]]+\z/ === str } }
        x.report('not a non-whitespace char') { strings.each {|str| str.empty? || !(/[[:^space:]]/ === str) } }
        x.compare!
      end
      
      # Warming up --------------------------------------
      # current regex
      #                          1.744k i/100ms
      # not a non-whitespace char
      #                          2.264k i/100ms
      # Calculating -------------------------------------
      # current regex
      #                          18.078k (± 8.9%) i/s -     90.688k
      # not a non-whitespace char
      #                          23.580k (± 7.1%) i/s -    117.728k
      
      # Comparison:
      # not a non-whitespace char:    23580.3 i/s
      # current regex            :    18078.2 i/s - 1.30x slower
      ```
      
      This makes the method roughly 30% faster `(23.580 - 18.078)/18.078 * 100`.
      
      cc/ @fxn
      54243fec
  7. 20 4月, 2016 2 次提交
    • X
      ~3.5x speedup of String#blank? for empty strings · 697384df
      Xavier Noria 提交于
      See the rationale in the comment in this patch.
      
      To benchmark this I ran a number of variations, ultimately narrowing to
      
          require 'benchmark/ips'
      
          str = ''
          regexp = /\A[[:space:]]*\z/
      
          Benchmark.ips do |x|
            x.report('regexp') { regexp === str }
            x.report('empty')  { str.empty? || regexp === str }
            x.compare!
          end
      
      This benchmark has consistently reported speedups around 3.5x:
      
          Calculating -------------------------------------
                        regexp    69.197k i/100ms
                         empty   115.468k i/100ms
          -------------------------------------------------
                        regexp      2. 6.3%) i/s -     13.839M
                         empty      9. 8.8%) i/s -     47.804M
      
          Comparison:
                         empty:  9642607.6 i/s
                        regexp:  2768351.9 i/s - 3.48x slower
      
      Sometimes even reaching 4x.
      
      Running the same bechmark on strings of 10 or 100 characters (with
      whitespace or present) has shown a slowdown of just about 1.01/1.02.
      Marginal, we seem to have a worthwhile trade-off here.
      697384df
    • A
      Add ActiveSupport::TimeZone.country_zones helper · 318ee541
      Andrey Novikov 提交于
      That helper will return time zones for any country that tzdata knows about.
      So it will be much simpler for non-US people to list own country time zones
      in HTML selects or anywhere.
      318ee541
  8. 19 4月, 2016 6 次提交
  9. 18 4月, 2016 3 次提交
  10. 17 4月, 2016 3 次提交
  11. 13 4月, 2016 5 次提交