Skip to content

Instantly share code, notes, and snippets.

@JUNKI555
Created July 8, 2023 06:23
Show Gist options
  • Save JUNKI555/79f886b42f68372b73656ef17142f3ed to your computer and use it in GitHub Desktop.
Save JUNKI555/79f886b42f68372b73656ef17142f3ed to your computer and use it in GitHub Desktop.
Ruby 重複削除スピードテスト
# ruby uniq speed test : Ruby 2.7.3
# こっちも参考に
# https://www.eisbahn.jp/yoichiro/2012/04/ruby_uniq_array.html#gsc.tab=0
# https://zenn.dev/universato/articles/20201210-z-ruby
#
#
# :::::Result: (何回か試行したが大差なかった)
# [109] pry(main)> uniq_email_and_user_names
# 1.378417334
# => 10
# [110] pry(main)> set_email_and_user_names
# 1.60182825
# => 10
# [111] pry(main)> hash_email_and_user_names
# 1.365713918
# => 10
# [112] pry(main)> uniq_emails
# 0.640594917
# => 10
# [113] pry(main)> set_emails
# 1.329802959
# => 10
# [114] pry(main)> hash_emails
# 0.972381917
# => 10
#
# :::::ChatGPT(3.5)くんからのアドバイス
# 処理速度の観点から見ると、uniq_emails関数が最も高速な方法です。これは、Array.uniqが高度に最適化されたアルゴリズムを使用しているためです。
# uniqメソッドは、要素の順序を保持しながら重複を削除します。
#
# 一方、set_emails関数はeach_with_objectとSet.newを使用して一意の要素を集めますが、これは比較的遅い方法です。
# Setオブジェクトは重複を許さず、要素の挿入順序を保持しますが、Setオブジェクトに要素を追加する際にハッシュ関数を使用するため、要素の追加には追加の処理時間がかかります。
#
# hash_emails関数は、ハッシュを使用して一意の要素を集めますが、Setオブジェクトを使用する方法と比較してさらに遅くなる可能性があります。
# これは、ハッシュ関数の計算やハッシュの衝突の処理が追加されるためです。
# ---
# uniq_email_and_user_names関数では、email_and_user_names配列の各要素から[:email]を取り出し、uniqメソッドを使用して重複を削除しています。
# set_email_and_user_names関数では、email_and_user_names配列の各要素から[:email]を取り出し、Setオブジェクトを使用して重複を削除しています。
# hash_email_and_user_names関数では、ハッシュを使用して重複を削除しています。email_and_user_names配列の各要素をループし、temporary_hashという一時的なハッシュに[:email]をキーとして追加します。その後、temporary_hash.keysを使用して重複を削除しています。
#
# これらの方法は、いずれもループ処理やマッピングを行っており、要素ごとに操作を行っているため、処理速度に大きな差はありません。
#
# :::::以下、コード
# email_and_user_names という Hash の配列からemailを取り出してつぶす
def uniq_email_and_user_names
email_and_user_names = []
1000000.times {|i| email_and_user_names << {email:"#{i/100000}@hoge.com", user_name:"株式会社#{i}"}}
s = Time.now
result = email_and_user_names.map {|x| x[:email]}.uniq
e = Time.now
puts e - s
result.length
end
def set_email_and_user_names
email_and_user_names = []
1000000.times {|i| email_and_user_names << {email:"#{i/100000}@hoge.com", user_name:"株式会社#{i}"}}
s = Time.now
result = email_and_user_names.each_with_object(Set.new) { |hash, set| set << hash[:email] }.to_a
e = Time.now
puts e - s
result.length
end
def hash_email_and_user_names
email_and_user_names = []
1000000.times {|i| email_and_user_names << {email:"#{i/100000}@hoge.com", user_name:"株式会社#{i}"}}
s = Time.now
temporary_hash = {}
email_and_user_names.each {|x| temporary_hash[x[:email]] = x[:email]}
result = temporary_hash.keys
e = Time.now
puts e - s
result.length
end
# emails という配列をつぶす
def uniq_emails
emails = []
1000000.times {|i| emails << "#{i/100000}@hoge.com"}
s = Time.now
result = emails.uniq
e = Time.now
puts e - s
result.length
end
def set_emails
emails = []
1000000.times {|i| emails << "#{i/100000}@hoge.com"}
s = Time.now
result = emails.each_with_object(Set.new) { |email, set| set << email }.to_a
e = Time.now
puts e - s
result.length
end
def hash_emails
emails = []
1000000.times {|i| emails << "#{i/100000}@hoge.com"}
s = Time.now
temporary_hash = {}
emails.each {|x| temporary_hash[x] = x}
result = temporary_hash.keys
e = Time.now
puts e - s
result.length
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment