fnando / browser

Do some browser detection with Ruby. Includes ActionController integration.
MIT License
2.44k stars 358 forks source link

Changed to delay parsing AcceptLanguage until `Browser::Base#accept_language called first #498

Closed walf443 closed 3 years ago

walf443 commented 3 years ago

I noticed that calling accept_language is rare case on our usecases, and in most cases, there is no need to parse Accept-Language.

This change is useful when parsing UserAgent of huge access logs with browser gem.

Benchmark result is followings:

require 'benchmark/ips'
require 'browser'

target_ua = "Chrome"
target_accept_language = "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3"

Benchmark.ips do |x|
  x.report("before") { Browser::Base.new(target_ua, accept_language: target_accept_language).accept_language }
  x.report("after") { Browser::Base.new(target_ua, accept_language: target_accept_language) }
end
$ bundle exec ruby benchamrk.rb
Warming up --------------------------------------
              before     4.274k i/100ms
               after   105.215k i/100ms
Calculating -------------------------------------
              before     42.894k (± 3.3%) i/s -    217.974k in   5.087531s
               after      1.034M (± 2.1%) i/s -      5.261M in   5.090505s
fnando commented 3 years ago

Thanks for this, @walf443! I merged it via #499.