Skip to content

Commit 7eb3576

Browse files
author
John Hawthorn
committed
Optimize Backend::Simple#available_locales
Previously available_locales was a little bit slow. For each locale in translations it would: * build a new array of all the top-level keys in that locale * build a second array of those keys except :i18n * add that locale to the list if the second array was not empty For locales with many translations this can build somewhat sizeable arrays. Instead we can perform the same operation, rejecting locales with either no keys or only :i18n without allocating any new objects. We reject based on the condition: data.size <= 1 && (data.empty? || data.has_key?(:i18n)) This ends up being about 4x faster (though this of course depends on the exact locales being used): Benchmark.ips do |x| x.report("I18n.available_locales") do I18n.available_locales end end Before: 11.447k (± 2.9%) i/s - 57.869k in 5.059738s After: 47.810k (± 2.8%) i/s - 242.060k in 5.067332s
1 parent 7c6ccf4 commit 7eb3576

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

lib/i18n/backend/simple.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def store_translations(locale, data, options = {})
4444
def available_locales
4545
init_translations unless initialized?
4646
translations.inject([]) do |locales, (locale, data)|
47-
locales << locale unless (data.keys - [:i18n]).empty?
47+
locales << locale unless data.size <= 1 && (data.empty? || data.has_key?(:i18n))
4848
locales
4949
end
5050
end

0 commit comments

Comments
 (0)