なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2016/05/14)

2016/05/14分のコミットです。

CHANGELOGへの追加はありませんでした。


Add notes on cosmetic patches

CONTRIBUTING.mdの修正です。

Did you fix whitespace, format code, or make a purely cosmetic patch?の項を追加し、些細な修正(空白の削除、フォーマットの調整等)のPRは受け入れられない旨説明を追加しています。


Merge pull request #25003 from kangkyu/missing_line

activerecord/lib/active_record/migration.rbの修正です。

ActiveRecord::EnvironmentMismatchErrorのメッセージの終端に改行を追加しています。


Perfomance fix for Enumerable#index_by

activesupport/lib/active_support/core_ext/enumerable.rbの修正です。

Enumerable#index_byリファクタリングを行っています。

  def index_by
     if block_given?
-      Hash[map { |elem| [yield(elem), elem] }]
+      result = {}
+      each { |elem| result[yield(elem)] = elem }
+      result

ベンチマークの内容及び結果は以下のとおり。

module Enumerable
  # current behaviour
  def index_by
    if block_given?
      Hash[map { |elem| [yield(elem), elem] }]
    else
      to_enum(:index_by) { size if respond_to?(:size) }
    end
  end

  # new behaviour
  def index_by2
    if block_given?
      result = {}
      each {|elem| result[yield(elem)] = elem }
      result
    else
      to_enum(:index_by) { size if respond_to?(:size) }
    end
  end
end

ExpandedPayment = Struct.new(:dollars, :cents)
arr = [
  ExpandedPayment.new(5, 99),
  ExpandedPayment.new(15, 199),
  ExpandedPayment.new(25, 299),
  ExpandedPayment.new(5, 99),
  ExpandedPayment.new(15, 1199),
  ExpandedPayment.new(25, 2299),
  ExpandedPayment.new(55, 5399)
]
Benchmark.ips do |x|
  x.report('before')   { arr.index_by(&:dollars) }
  x.report('after')    { arr.index_by2(&:dollars) }
  x.compare!
end
Calculating -------------------------------------
              before    34.731k i/100ms
               after    48.206k i/100ms
-------------------------------------------------
              before    508.451k (± 1.2%) i/s -      2.570M
               after    720.068k (± 0.9%) i/s -      3.615M

Comparison:
               after:   720067.6 i/s
              before:   508451.1 i/s - 1.42x slower

割と差が出るもんですねえ。