@@ -34,12 +34,16 @@ class DeviceDetector
3434 MAJOR_VERSION_4 = Gem ::Version . new ( '4.0' )
3535 MAJOR_VERSION_8 = Gem ::Version . new ( '8.0' )
3636
37+ REGEX_CACHE = ::DeviceDetector ::MemoryCache . new ( { } )
38+ private_constant :REGEX_CACHE
39+
3740 attr_reader :client_hint , :user_agent
3841
3942 def initialize ( user_agent = nil , headers = nil )
4043 @parsers = { }
4144
4245 @vendor_fragment_parser = DeviceDetector ::Parser ::VendorFragment . new
46+ @operating_system_parser = DeviceDetector ::Parser ::OperatingSystem . new
4347
4448 add_parser ( Parser ::Client ::FeedReader . new )
4549 add_parser ( Parser ::Client ::MobileApp . new )
@@ -59,7 +63,7 @@ def initialize(user_agent = nil, headers = nil)
5963
6064 add_parser ( Parser ::Bot . new )
6165
62- use ( user_agent , headers )
66+ use ( user_agent , headers ) if user_agent || headers
6367 end
6468
6569 def name
@@ -175,7 +179,7 @@ def parse_bot
175179 end
176180
177181 def parse_os
178- parser = Parser :: OperatingSystem . new
182+ parser = @operating_system_parser
179183 parser . use ( @user_agent , @client_hints )
180184
181185 @os = parser . parse
@@ -340,8 +344,11 @@ def add_parser(parser)
340344 end
341345
342346 def match_user_agent ( regex )
343- src = regex . gsub ( '/' , '\/' )
344- regexp = Regexp . new ( "(?:^|[^A-Z_-])(?:#{ src } )" , Regexp ::IGNORECASE )
347+ regexp = REGEX_CACHE . get_or_set ( regex ) do
348+ src = regex . gsub ( '/' , '\/' )
349+ Regexp . new ( "(?:^|[^A-Z_-])(?:#{ src } )" , Regexp ::IGNORECASE )
350+ end
351+
345352 match = @user_agent . match ( regexp )
346353 return unless match
347354
0 commit comments