Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
天下一HTTPRouter武闘会.pdf
Search
bmf_san
December 14, 2022
Programming
4.6k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
天下一HTTPRouter武闘会.pdf
bmf_san
December 14, 2022
More Decks by bmf_san
See All by bmf_san
桃太郎で始めるRego入門‐今日から使えるRegoの基本編
bmf_san
0
100
完璧を求めない意思決定-アクセス制御基盤における制約との向き合い方
bmf_san
5
20k
AAPについて調べてみた
bmf_san
0
150
レーダーをつくる
bmf_san
0
93
契約テストとPactについて
bmf_san
0
140
5分でわかるSLO
bmf_san
2
190
権限について考える
bmf_san
2
190
自作HTTPルーターから新しいServeMuxへ
bmf_san
3
1.9k
古くなってしまったPHPフレームワークとPHPのバージョンアップ戦略
bmf_san
1
530
Other Decks in Programming
See All in Programming
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
240
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
190
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
280
Heart of Swift Concurrency
koher
0
1.1k
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
280
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
mrbgem 三角測量 開発
ogom
0
150
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
100
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.6k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2k
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
WENDY [Excerpt]
tessaabrams
14
40k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
290
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
930
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
Utilizing Notion as your number one productivity tool
mfonobong
4
600
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
290
Designing for humans not robots
tammielis
254
26k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Transcript
ఱԼҰHTTPRouterಆձ @bmf_san 2022.12.14 Makuake LT
Who am Iʁ • ࣗ࡞HTTP Routerܳਓ
ʮԶΑΓڧౕ͍ʹձ͍ʹߦ͘ʯ
Զ https://github.com/bmf-san/goblin
Goblin • ԶʹΑΔԶͷͨΊͷԶͷHTTP Router • MIT LicenseͳͷͰԶҎ֎͑Δͧ • net/httpޓ •
HTTP Routerͱͯ͠ͷجຊతͳػೳΛ͍࣋ͬͯΔͣ • Trieϕʔε • awesome-goʹܝࡌ
Trieͱ • จࣈྻͷू߹Λѻ͏ߏͷҰछ • ŧŐşŽ • https://github.com/bmf-san/road-to-algorithm- master/blob/master/data_structures/tree/trie/ trie.go
ΦϨΦϨτϥΠ
͏ͪΐͬͱৄ͍͠ • ŧŐşŽʢڵຯ࣋ͬͨਓݟͯΈ͍ͯͩ͘͞:Dʣ • https://speakerdeck.com/bmf_san/ httpdetukuruhttprutazi-zuo-ru-men
ͰɺԿͷʁ • ԶΑΓڧ͍ͭʹձ͍͍ͨ • ഊΛΓ͍ͨʢϑϥάʣ
HPCMJOͱଞͷ)5513PVUFSͷ ύϑΥʔϚϯεΛൺֱ͍ͨ͠ʂʂ
ϕϯνϚʔΧʔ࡞ͬͨΝ • https://github.com/bmf-san/go-router-benchmark • ݩʑ༏लͳϕϯνϚʔΧʔ͕͕͋ͬͨɾɾ • https://github.com/julienschmidt/go-http-routing- benchmark • ϝϯςࢭ·ͬͪΌͬͨ
• GoblinՃͷPRग़͚ͨ͠ͲClose͞ΕͪΌͬͨ..
લఏ • HTTP RouterʹΑͬͯવػೳ͕ࠩ͋Δ • ͯ͢ΛΧόʔ͢Δςετ͍͠ • શͳύϑΥʔϚϯεൺֱͰͳ͍ • ֤HTTP
RouterͷσʔλߏͱΞϧΰϦζϜͷಘҙɾෆಘҙ ͕͋ΔͷͰɺςετέʔεʹΑͬͯಘखෆಘखͷ͕ࠩग़Δ
ςετέʔε • ”୳ࡧ”ʢϧʔςΟϯάʣ͚ͩςετ • ”ૠೖ”ʢϧʔςΟϯάͷఆٛʣର֎ • Rootʢ/ʣͷϧʔςΟϯάΛ1ύλʔϯ • ੩తͳϧʔςΟϯάΛ3ύλʔϯ •
Ex. /foo, /foo/bar • ಈతͳϧʔςΟϯάΛ3ύλʔϯ • Ex. /foo/:bar, /foo/:bar/:baz • cf. https://github.com/bmf-san/go-router-benchmark/blob/ main/benchmark.go
ରͷHTTP Router • HTTP RouterιϜϦΤͷޗഐ͕બΜͩHTTP Router 14બ • ։ൃ͕ࢭ·͍ͬͯΔͷ͋Δ͕ɺߴੑೳɾߴػೳΛᨳ͍ͬͯΔͷϐοΫΞοϓ •
༗໊ॴ͍͑ͯΔͣɾɾ • bmf-san/goblin • julienschmidt/httprouter • go-chi/chi • gin-gonic/gin • uptrace/bunrouter • dimfeld/httptreemux • beego/mux • gorilla/mux • nissy/bon • naoina/denco • labstack/echo • gocraft/web • vardius/gorouter • go-ozzo/ozzo-routing
ϕϯνϚʔΧʔ࣮ߦ݁Ռ go test -bench=. -benchmem goos: darwin goarch: amd64 pkg:
github.com/go-router-benchmark cpu: VirtualApple @ 2.50GHz BenchmarkStaticRoutesRootGoblin-8 37810608 31.62 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Goblin-8 17207332 68.55 ns/op 16 B/op 1 allocs/op BenchmarkStaticRoutes5Goblin-8 5786544 208.3 ns/op 80 B/op 1 allocs/op BenchmarkStaticRoutes10Goblin-8 2992412 400.3 ns/op 160 B/op 1 allocs/op BenchmarkPathParamColonRoutes1Goblin-8 1907245 627.5 ns/op 409 B/op 6 allocs/op BenchmarkPathParamColonRoutes5Goblin-8 525704 2269 ns/op 965 B/op 13 allocs/op BenchmarkPathParamColonRoutes10Goblin-8 275090 4399 ns/op 1608 B/op 19 allocs/op BenchmarkStaticRoutesRootHTTPRouter-8 100000000 10.46 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1HTTPRouter-8 100000000 10.33 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5HTTPRouter-8 100000000 10.44 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10HTTPRouter-8 100000000 10.36 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1HTTPRouter-8 27414811 43.20 ns/op 32 B/op 1 allocs/op BenchmarkPathParamColonRoutes5HTTPRouter-8 10295874 114.4 ns/op 160 B/op 1 allocs/op BenchmarkPathParamColonRoutes10HTTPRouter-8 6092434 197.3 ns/op 320 B/op 1 allocs/op BenchmarkStaticRoutesRootChi-8 5429904 220.0 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutes1Chi-8 5290057 220.6 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutes5Chi-8 5434046 219.3 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutes10Chi-8 5505698 212.7 ns/op 304 B/op 2 allocs/op BenchmarkPathParamBracketRoutes1Chi-8 4445071 268.9 ns/op 304 B/op 2 allocs/op BenchmarkPathParamBracketRoutes5Chi-8 2730680 437.0 ns/op 304 B/op 2 allocs/op BenchmarkPathParamBracketRoutes10Chi-8 1888065 636.3 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutesRootGin-8 32862794 36.33 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Gin-8 33070339 36.07 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Gin-8 32586816 36.17 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Gin-8 32143107 37.20 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Gin-8 27500701 42.62 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes5Gin-8 15258900 78.41 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes10Gin-8 9522596 127.7 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutesRootBunRouter-8 64215045 18.42 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1BunRouter-8 56828720 21.02 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5BunRouter-8 56755030 20.99 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10BunRouter-8 56908671 20.84 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1BunRouter-8 35162946 33.80 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes5BunRouter-8 8425648 140.7 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes10BunRouter-8 4257427 283.7 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutesRootHTTPTreeMux-8 6690556 179.2 ns/op 328 B/op 3 allocs/op BenchmarkStaticRoutes1HTTPTreeMux-8 6562962 183.0 ns/op 328 B/op 3 allocs/op BenchmarkStaticRoutes5HTTPTreeMux-8 5362312 224.5 ns/op 328 B/op 3 allocs/op BenchmarkStaticRoutes10HTTPTreeMux-8 4219711 284.1 ns/op 328 B/op 3 allocs/op BenchmarkPathParamColonRoutes1HTTPTreeMux-8 3174328 377.0 ns/op 680 B/op 6 allocs/op BenchmarkPathParamColonRoutes5HTTPTreeMux-8 1545889 757.7 ns/op 904 B/op 9 allocs/op BenchmarkPathParamColonRoutes10HTTPTreeMux-8 807580 1474 ns/op 1742 B/op 11 allocs/op BenchmarkStaticRoutesRootBeegoMux-8 22258030 52.52 ns/op 32 B/op 1 allocs/op BenchmarkStaticRoutes1BeegoMux-8 15893838 75.32 ns/op 32 B/op 1 allocs/op BenchmarkStaticRoutes5BeegoMux-8 1000000 1071 ns/op 32 B/op 1 allocs/op BenchmarkStaticRoutes10BeegoMux-8 592300 2029 ns/op 32 B/op 1 allocs/op BenchmarkPathParamColonRoutes1BeegoMux-8 3219261 373.9 ns/op 672 B/op 5 allocs/op BenchmarkPathParamColonRoutes5BeegoMux-8 824432 1420 ns/op 672 B/op 5 allocs/op BenchmarkPathParamColonRoutes10BeegoMux-8 354176 3350 ns/op 1254 B/op 6 allocs/op BenchmarkStaticRoutesRootGorillaMux-8 2076849 574.2 ns/op 720 B/op 7 allocs/op BenchmarkStaticRoutes1GorillaMux-8 2066920 579.6 ns/op 720 B/op 7 allocs/op BenchmarkStaticRoutes5GorillaMux-8 1967010 610.1 ns/op 720 B/op 7 allocs/op BenchmarkStaticRoutes10GorillaMux-8 1824106 658.2 ns/op 720 B/op 7 allocs/op BenchmarkPathParamBracketRoutes1GorillaMux-8 1339666 895.5 ns/op 1024 B/op 8 allocs/op BenchmarkPathParamBracketRoutes5GorillaMux-8 526460 2262 ns/op 1088 B/op 8 allocs/op BenchmarkPathParamBracketRoutes10GorillaMux-8 238946 5008 ns/op 1751 B/op 9 allocs/op BenchmarkStaticRoutesRootBon-8 88309966 13.51 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Bon-8 87832992 13.51 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Bon-8 86620446 13.48 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Bon-8 87585646 14.03 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Bon-8 6392168 186.3 ns/op 304 B/op 2 allocs/op BenchmarkPathParamColonRoutes5Bon-8 4628920 259.3 ns/op 304 B/op 2 allocs/op BenchmarkPathParamColonRoutes10Bon-8 3381514 355.9 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutesRootDenco-8 79634784 14.46 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Denco-8 79188319 14.38 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Denco-8 79437754 14.36 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Denco-8 74332171 15.32 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Denco-8 19618006 60.16 ns/op 32 B/op 1 allocs/op BenchmarkPathParamColonRoutes5Denco-8 8545141 140.5 ns/op 160 B/op 1 allocs/op BenchmarkPathParamColonRoutes10Denco-8 5004351 239.7 ns/op 320 B/op 1 allocs/op BenchmarkStaticRoutesRootEcho-8 33267644 35.72 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Echo-8 30976101 38.24 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Echo-8 21207642 56.36 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Echo-8 12649693 94.39 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Echo-8 26137147 45.25 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes5Echo-8 11194768 106.2 ns/op 0 B/op 0 allocs/op
$47ʹՃͯ͠εϓγͰཧͨ͠
static-root • ςετέʔεɿ/ • goblinதؒͱ͍ͬͨײ͡ • ্ҐʢTop 4ʣͱͷࠩ݁ߏ͋Δ
static-1 • ςετέʔεɿ/foo • goblin͜ͷஈ֊Ͱmemallocs͕ग़ͯ͠·͏
static-5 • ςετέʔεɿ/foo/bar/baz/qux/quux • goblinmemallocs1ճͰࡁΜͰ͍Δ͕ɺbeego/muxʹൈ͔ΕΔ • ্Ґ͕ڧ͍ɻύϑΥʔϚϯεྼԽ͕΄ͱΜͲͳ͍ • static-1 ~
5Λશ෦·ͱΊͨέʔεͰͷςετ͢ΕΑ͔ͬͨ.. pathparam ಉ༷
static-10 • ςετέʔεɿ/foo/bar/baz/qux/quux/corge/grault/garply/waldo/fred • goblin͞ΒʹॱҐΛམͱ͢ • ্ҐϝϞϦׂΓ͕ͯগͳ͍ • beego/muxϝϞϦׂΓͯগͳΊ͕ͩɺ࣮ߦΊ
pathparam-1 • ςετέʔεɿ/foo/:bar • ্Ґੑೳ͕፰߅͍ͯ͠Δ • goblinॳઓ͔Βݫ͍͠ઓ͍ • staticͷͱ͖HTTP Routerʹ܉্͕͕͕ͬͨɺpathparamGinͷ΄͏͔
• ginͷ෦HTTP Routerϕʔεͷ࣮ʹͳ͍ͬͯΔ
pathparam-5 • ςετέʔεɿ/foo/:bar/:baz/:qux/:quux/:corge • goblinϫʔετ1ʹ • pathparam-3͘Β͍ݟ͓͖͔ͯͩͬͨ͘
pathparam-10 • ςετέʔεɿ/foo/:bar/:baz/:qux/:quux/:corge/:grault/:garply/:waldo/:fred/:plugh • ginڧ͗͢ • goblin͞Μ…
݁Ռൃද • static෦ • HTTP Router, Bon, Denco͕Top3 • goblin্ҐͱͷԿ͔͑ΒΕͳ͍นΛײͨ͡
• pathpara෦ • gin, ozzo-routing, echo͕Top3 • goblin࠷ۙΞʔΧΠϒ͞Εͨ͋Β͍͠gorilla/muxͱྑ͍উෛ • ্Ґͷσʔλߏߴʹ࠷దԽ͞Εͨ • echoɺginɺhttprouterɺbonɺchi RadixɺdencoDouble array • ՐΛݟΔΑΓ໌Β͔͕ͩɺΦϨΦϨτϥΠͰউͯͳ͍ • খखઌͷվળͰ͍͚ͭͳ͍ɻߴͳ͕ඞཁ • ߴͳͷ࠾༻ˠϚΠΫϩͳνϡʔχϯά • ֤HTTP Routerͷ࣮ͪΌΜͱݟͯͳ͍ͷͰݚڀ͍ͨ͠ͱ͜Ζ
ఱԼҰHTTPRouterಆձʹࢀՃ͠Α͏ • ࣗ࡞HTTP RouterΛ࡞ͬͯࢀઓ͍ͨ͠ਓ • ŧŐşŽʢ؆қతͳTrieϕʔεͷHTTP Routerʣ • https://github.com/bmf-san/introduction-to-golang-http- router-made-with-net-http
• 1Ոʹ1HTTP Router͕ͭ͘ΕΔͣ
ʮԶΑΓڧౕ͍͔͍͠ͳ͔ͬͨʯ ʮഊΛݏͱ͍͏΄Ͳͬͨʯ ʙʢʣʙ