Skip to content

Commit 072afe5

Browse files
Merge pull request #334 from ua-parser/benchmark-minor-changes
Benchmark minor changes
2 parents 4637b11 + bc79f06 commit 072afe5

File tree

5 files changed

+209
-86
lines changed

5 files changed

+209
-86
lines changed

modules/benchmark/src/main/resources/regexes_@7388149c.yaml renamed to modules/benchmark/src/main/resources/regexes_@354aebe.yaml

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ user_agent_parsers:
148148
family_replacement: 'Pinterestbot'
149149

150150
# Bots
151-
- regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|GoogleOther|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer|GPTBot)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
151+
- regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|GoogleOther|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer|GPTBot|Google-InspectionTool)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
152152

153153
# AWS S3 Clients
154154
# must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
@@ -443,12 +443,6 @@ user_agent_parsers:
443443
- regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)'
444444
family_replacement: 'Coc Coc'
445445

446-
# Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
447-
- regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
448-
family_replacement: 'Baidu Browser'
449-
- regex: '(FlyFlow)/(\d+)\.(\d+)'
450-
family_replacement: 'Baidu Explorer'
451-
452446
# MxBrowser is Maxthon. Must go before Mobile Chrome for Android
453447
- regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
454448
family_replacement: 'Maxthon'
@@ -477,6 +471,12 @@ user_agent_parsers:
477471
- regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
478472
family_replacement: 'Google'
479473

474+
# Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
475+
- regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
476+
family_replacement: 'Baidu Browser'
477+
- regex: '(FlyFlow|flyflow|baiduboxapp)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
478+
family_replacement: 'Baidu Explorer'
479+
480480
# QQ Browsers
481481
- regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
482482
family_replacement: 'QQ Browser Mini'
@@ -506,10 +506,22 @@ user_agent_parsers:
506506
family_replacement: 'Ecosia Android'
507507

508508
# VivoBrowser
509-
- regex: '(VivoBrowser)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
509+
- regex: '(VivoBrowser)\/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
510510

511511
# HiBrowser
512-
- regex: '(HiBrowser)\/v(\d+)\.(\d+)\.(\d+)\.(\d+)'
512+
- regex: '(H[Ii]Browser)\/v(\d+)\.(\d+)\.(\d+)\.(\d+)'
513+
family_replacement: 'HiBrowser'
514+
515+
# Honor Browser
516+
- regex: '(bdhonorbrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
517+
family_replacement: 'Honor Browser'
518+
519+
# Weibo
520+
# Must before Chrome Mobile WebView
521+
- regex: '(weibo)__(\d+)\.(\d+)\.(\d+)'
522+
family_replacement: 'Weibo'
523+
- regex: '(WeiboliteiOS|WeiboIntliOS)'
524+
family_replacement: 'Weibo'
513525

514526
# Chrome Mobile
515527
- regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
@@ -592,7 +604,7 @@ user_agent_parsers:
592604
- regex: '(115Browser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
593605
family_replacement: '115 Browser'
594606

595-
# Avira
607+
# Avira
596608
- regex: '(Avira)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
597609
family_replacement: 'Avira'
598610

@@ -614,7 +626,7 @@ user_agent_parsers:
614626
# Smart Lenovo Browser
615627
- regex: '(SLBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+) SLBChan/(\d+)'
616628
family_replacement: 'Smart Lenovo Browser'
617-
629+
618630
# Atom Browser
619631
- regex: '(Atom)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
620632
family_replacement: 'Atom Browser'
@@ -667,6 +679,23 @@ user_agent_parsers:
667679
- regex: '(JiSu)/(\d+)\.(\d+)\.(\d+)'
668680
family_replacement: 'JiSu Browser'
669681

682+
# Wolvic Browser
683+
- regex: '(Wolvic)/(\d+)\.(\d+)\.(\d+)'
684+
family_replacement: 'Wolvic Browser'
685+
686+
# HeyTap Browser
687+
- regex: '(HeyTapBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
688+
family_replacement: 'HeyTap Browser'
689+
690+
# SmartTV WebBrowser
691+
- regex: '(Thano)/(\d+)\.(\d+)'
692+
family_replacement: 'SmartTV WebBrowser'
693+
694+
# WeChat Browser
695+
- regex: '(MicroMessenger)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
696+
family_replacement: 'WeChat Browser'
697+
698+
670699
#### END SPECIAL CASES TOP ####
671700

672701
#### MAIN CASES - this catches > 50% of all browsers ####
@@ -1485,7 +1514,7 @@ os_parsers:
14851514
# Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
14861515
- regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
14871516
os_replacement: 'Mac OS X'
1488-
1517+
14891518
##########
14901519
# Hashicorp API
14911520
# APN/1.0 HashiCorp/1.0 Terraform/1.8.0 (+https://www.terraform.io) terraform-provider-aws/4.67.0 (+https://registry.terraform.io/providers/hashicorp/aws) aws-sdk-go/1.44.261 (go1.19.8; darwin; arm64)
@@ -2013,7 +2042,7 @@ device_parsers:
20132042
# Mobile Spiders
20142043
# Catch the mobile crawler before checking for iPhones / Androids.
20152044
#########
2016-
- regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
2045+
- regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html|Google-InspectionTool)|AdsBot-Google-Mobile.{0,200}iPhone)'
20172046
regex_flag: 'i'
20182047
device_replacement: 'Spider'
20192048
brand_replacement: 'Spider'
@@ -3215,7 +3244,7 @@ device_parsers:
32153244
device_replacement: 'HTC $1'
32163245
brand_replacement: 'HTC'
32173246
model_replacement: '$1'
3218-
- regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
3247+
- regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
32193248
regex_flag: 'i'
32203249
device_replacement: 'HTC $1 $2'
32213250
brand_replacement: 'HTC'
@@ -5619,7 +5648,6 @@ device_parsers:
56195648
brand_replacement: 'Asus'
56205649
model_replacement: '$1'
56215650

5622-
56235651
##########
56245652
# Bird
56255653
##########
@@ -5819,7 +5847,6 @@ device_parsers:
58195847
brand_replacement: 'Motorola'
58205848
model_replacement: '$2'
58215849

5822-
58235850
##########
58245851
# nintendo
58255852
##########
@@ -6023,7 +6050,7 @@ device_parsers:
60236050
##########
60246051
# Spiders (this is a hack...)
60256052
##########
6026-
- regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper|RecipeRadar|GPTBot)'
6053+
- regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper|RecipeRadar|GPTBot|Google-InspectionTool)'
60276054
regex_flag: 'i'
60286055
device_replacement: 'Spider'
60296056
brand_replacement: 'Spider'
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.uaparser.scala.benchmark
2+
3+
import scala.io.Source
4+
5+
import org.uaparser.scala.Parser
6+
7+
object BenchmarkSupport {
8+
9+
def loadLinesFromResource(resourceName: String): Array[String] = {
10+
val source = Source.fromResource(resourceName)
11+
try
12+
source.getLines().map(_.trim).filter(_.nonEmpty).toArray
13+
finally
14+
source.close()
15+
}
16+
17+
def loadParserForPinnedRegexes(): Parser = {
18+
val inputStream = getClass.getClassLoader.getResourceAsStream("regexes_@354aebe.yaml")
19+
try
20+
Parser.fromInputStream(inputStream).get
21+
finally
22+
inputStream.close()
23+
}
24+
25+
@inline def incrementIndex(i: Int, n: Int): Int = {
26+
val j = i + 1
27+
if (j == n) 0 else j
28+
}
29+
}
Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,47 @@
11
package org.uaparser.scala.benchmark
22

3-
import scala.io.Source
3+
import java.util.concurrent.TimeUnit
44

5-
import org.openjdk.jmh.annotations.{Benchmark, Scope, State}
5+
import org.openjdk.jmh.annotations.*
66
import org.openjdk.jmh.infra.Blackhole
77

88
import org.uaparser.scala.Parser
99

10-
@State(Scope.Benchmark)
10+
@BenchmarkMode(Array(Mode.Throughput))
11+
@OutputTimeUnit(TimeUnit.SECONDS)
12+
@State(Scope.Thread)
1113
class UapScalaAllBenchmarks {
1214

13-
// an entire bundle of strings taken from the current suite of tests
14-
val allUserAgentStrings: List[String] = Source.fromResource("all-user-agents.txt").getLines().toList
15+
private var parser: Parser = _
16+
private var uas: Array[String] = _
17+
private var idx: Int = 0
1518

16-
var parser: Parser =
17-
Parser.fromInputStream(Thread.currentThread.getContextClassLoader.getResourceAsStream("regexes_@7388149c.yaml")).get
19+
@Setup(Level.Trial)
20+
def setup(): Unit = {
21+
parser = BenchmarkSupport.loadParserForPinnedRegexes()
22+
uas = BenchmarkSupport.loadLinesFromResource("all-user-agents.txt")
23+
idx = 0
24+
}
1825

19-
@Benchmark
20-
def measureAllStrDeviceParser(bh: Blackhole): Unit =
21-
allUserAgentStrings.foreach(s => bh.consume(parser.deviceParser.parse(s)))
26+
@Setup(Level.Iteration)
27+
def resetCursor(): Unit =
28+
idx = 0
2229

23-
@Benchmark
24-
def measureAllStrOsParser(bh: Blackhole): Unit =
25-
allUserAgentStrings.foreach(s => bh.consume(parser.osParser.parse(s)))
30+
@inline private def nextUA(): String = {
31+
val s = uas(idx)
32+
idx = BenchmarkSupport.incrementIndex(idx, uas.length)
33+
s
34+
}
2635

27-
@Benchmark
28-
def measureAllStrUserAgentParser(bh: Blackhole): Unit =
29-
allUserAgentStrings.foreach(s => bh.consume(parser.userAgentParser.parse(s)))
36+
@Benchmark def allDevice(bh: Blackhole): Unit =
37+
bh.consume(parser.deviceParser.parse(nextUA()))
3038

31-
@Benchmark
32-
def measureAllStrAllParser(bh: Blackhole): Unit =
33-
allUserAgentStrings.foreach(s => bh.consume(parser.parse(s)))
39+
@Benchmark def allOs(bh: Blackhole): Unit =
40+
bh.consume(parser.osParser.parse(nextUA()))
41+
42+
@Benchmark def allUserAgent(bh: Blackhole): Unit =
43+
bh.consume(parser.userAgentParser.parse(nextUA()))
44+
45+
@Benchmark def allAll(bh: Blackhole): Unit =
46+
bh.consume(parser.parse(nextUA()))
3447
}
Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,46 @@
11
package org.uaparser.scala.benchmark
22

3-
import scala.io.Source
3+
import java.util.concurrent.TimeUnit
44

5-
import org.openjdk.jmh.annotations.{Benchmark, Scope, State}
5+
import org.openjdk.jmh.annotations.*
66
import org.openjdk.jmh.infra.Blackhole
77

88
import org.uaparser.scala.Parser
99

10-
@State(Scope.Benchmark)
10+
@BenchmarkMode(Array(Mode.Throughput))
11+
@OutputTimeUnit(TimeUnit.SECONDS)
12+
@State(Scope.Thread)
1113
class UapScalaSampleBenchmarks {
12-
13-
// an entire bundle of strings taken from the current suite of tests
14-
val sampleUserAgentStrings: List[String] = Source.fromResource("sample-user-agents.txt").getLines().toList
15-
16-
var parser: Parser =
17-
Parser.fromInputStream(Thread.currentThread.getContextClassLoader.getResourceAsStream("regexes_@7388149c.yaml")).get
18-
19-
@Benchmark
20-
def measureSampleStrDeviceParser(bh: Blackhole): Unit =
21-
sampleUserAgentStrings.foreach(s => bh.consume(parser.deviceParser.parse(s)))
22-
23-
@Benchmark
24-
def measureSampleStrOsParser(bh: Blackhole): Unit =
25-
sampleUserAgentStrings.foreach(s => bh.consume(parser.osParser.parse(s)))
26-
27-
@Benchmark
28-
def measureSampleStrUserAgentParser(bh: Blackhole): Unit =
29-
sampleUserAgentStrings.foreach(s => bh.consume(parser.userAgentParser.parse(s)))
30-
31-
@Benchmark
32-
def measureSampleStrAllParser(bh: Blackhole): Unit =
33-
sampleUserAgentStrings.foreach(s => bh.consume(parser.parse(s)))
14+
private var parser: Parser = _
15+
private var uas: Array[String] = _
16+
private var idx: Int = 0
17+
18+
@Setup(Level.Trial)
19+
def setup(): Unit = {
20+
parser = BenchmarkSupport.loadParserForPinnedRegexes()
21+
uas = BenchmarkSupport.loadLinesFromResource("sample-user-agents.txt")
22+
idx = 0
23+
}
24+
25+
@Setup(Level.Iteration)
26+
def resetCursor(): Unit =
27+
idx = 0
28+
29+
@inline private def nextUA(): String = {
30+
val s = uas(idx)
31+
idx = BenchmarkSupport.incrementIndex(idx, uas.length)
32+
s
33+
}
34+
35+
@Benchmark def sampleDevice(bh: Blackhole): Unit =
36+
bh.consume(parser.deviceParser.parse(nextUA()))
37+
38+
@Benchmark def sampleOs(bh: Blackhole): Unit =
39+
bh.consume(parser.osParser.parse(nextUA()))
40+
41+
@Benchmark def sampleUserAgent(bh: Blackhole): Unit =
42+
bh.consume(parser.userAgentParser.parse(nextUA()))
43+
44+
@Benchmark def sampleAll(bh: Blackhole): Unit =
45+
bh.consume(parser.parse(nextUA()))
3446
}

0 commit comments

Comments
 (0)