From 7eca14987bf2df02836c5d405d16c2e8eb82e42b Mon Sep 17 00:00:00 2001 From: pranavbabu <54139019+pranavbabu@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:05:45 +0200 Subject: [PATCH] Improve performance of find_by_iso_numeric method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ruby 3.3.3 (2024-06-12 revision f1c7b6f435) [arm64-darwin23] Warming up -------------------------------------- Before optimization 2.135k i/100ms After optimization 55.681k i/100ms Calculating ------------------------------------- Before optimization 21.148k (± 0.8%) i/s (47.29 μs/i) - 106.750k in 5.048173s After optimization 549.315k (± 0.6%) i/s (1.82 μs/i) - 2.784M in 5.068425s Comparison: After optimization: 549314.7 i/s Before optimization: 21147.5 i/s - 25.98x slower --- lib/money/currency.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/money/currency.rb b/lib/money/currency.rb index f8b2a1d5df..db4f7062ef 100644 --- a/lib/money/currency.rb +++ b/lib/money/currency.rb @@ -83,8 +83,8 @@ def find(id) def find_by_iso_numeric(num) num = num.to_s.rjust(3, '0') return if num.empty? - id, _ = self.table.find { |key, currency| currency[:iso_numeric] == num } - new(id) + id = iso_numeric_index[num] + new(id) if id rescue UnknownCurrency nil end @@ -215,6 +215,12 @@ def reset! end private + + def iso_numeric_index + @iso_numeric_index ||= table.each_with_object({}) do |(id, attrs), index| + index[attrs[:iso_numeric]] = id + end + end def stringify_keys table.keys.each_with_object(Set.new) { |k, set| set.add(k.to_s.downcase) }