2016/05/14分のコミットです。
CHANGELOGへの追加はありませんでした。
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
割と差が出るもんですねえ。