Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
歴代のWeb Speed Hackathonの出題から考えるデグレしないパフォーマンス改善
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
did0es
August 20, 2025
Technology
860
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
歴代のWeb Speed Hackathonの出題から考えるデグレしないパフォーマンス改善
Browser and UI #3の登壇資料です。
スライド内のリンクは、
Googleスライド版
をご覧ください。
did0es
August 20, 2025
More Decks by did0es
See All by did0es
TypeScript Compiler APIとPHP-Parserを活用し、TypeScriptとPHPで型を共有する
shuta13
1
370
ブラウザの投機的読み込みと投機ルールAPIを理解し、Webサービスのパフォーマンスを最適化する
shuta13
3
330
うわっ...私のSwagger、古すぎ...?grpc-gateway向けのSwaggerと向き合う
shuta13
0
150
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
360
Reconciliationの世界
shuta13
0
0
なぜクラウドサービスで Web コンソールを提供するのか
shuta13
4
2.5k
5分でわかるPreactのVDOMで作るWebエディタ
shuta13
0
270
TailwindCSSでUIライブラリを作る際のハマりどころ
shuta13
0
810
codemodとうまく付き合うには
shuta13
0
3k
Other Decks in Technology
See All in Technology
"何を作るか"を任される エンジニアは、どう育つのか
yutaokafuji
1
270
トークン数だけでは測れない — Claude Code 組織展開の効果検証から学んだこと
makikub
0
140
データ基盤をDataformで整えた話 〜 開発環境を添えて 〜
takapy
0
130
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
2k
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
280
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
3
180
Building applications in the Gemini API family.
line_developers_tw
PRO
0
2.4k
探して_入れて_作って_使う_Agent_Skills___LT.pdf
peintangos
2
180
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
2
280
Reliability in the Age of AI: Engineering for AI Velocity
rrreeeyyy
0
110
新しいVibe Codingと”自走”について
watany
5
250
protovalidate-es を導入してみた
bengo4com
0
160
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
1
3.5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Building the Perfect Custom Keyboard
takai
2
790
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Rails Girls Zürich Keynote
gr2m
96
14k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
360
Docker and Python
trallard
47
3.9k
Navigating Team Friction
lara
192
16k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
The browser strikes back
jonoalderson
0
1.2k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Transcript
歴代のWeb Speed Hackathonの 出題から考える デグレしないパフォーマンス改善 2025/08/20 did0es
Hirai Shuta | did0es(🗣 ディドス) SWE, Next Experts(TypeScript)@CyberAgent, Inc. Lead
organizer FEC Tokyo, Meguro.es For more: did0.es
Web Speed Hackathon(WSH)の概要 • ⾮常に重たい Web アプリをチューニングして、いかに⾼速にするかを競う 競技 ◦ WebサーバーとAPIサーバーの両⽅の実装を改善
• 詳細 ◦ 採点:提出されたURLに対して、GHAでLighthouseを動かして計測 ◦ 期間:2⽇間 • 過去のお題 ◦ 2025:架空の動画配信サービス「AREMA」 ◦ 2024:架空の漫画サイト「Cyber TOON」(did0esが作問を⼀部担当) ◦ 2023:架空のショッピングサイト「買えるオーガニック」 ◦ 2022:架空のベッティングサービス「CyberTicket」 ◦ 2021:架空のSNSサイト「CAwitter」 ◦ 2020:架空のブログサイト「Amida Blog(あみぶろ)」
レギュレーション • 競技を進める上での公平性の担保のほか、以下が定められている ◦ 許可⭕ ▪ リポジトリのコードやファイルは全て変更して良い ▪ 外部のサービス(SaaSなど)は⾃由に利⽤して良い ◦
禁⽌❌ ▪ Google Chrome最新版で著しい機能落ちやデザイン差異を発⽣させる ▪ 悪意を持ってVRTと⼿動テストを通過させるためのコードを書く
レギュレーションチェックマジック(?) • 最終のレギュレーションチェックで順位がガラッと⼊れ替わる ◦ 上位勢がごっそりリーダーボードから消える現象がまあまあある ◦ 2023〜2025の間に開催された3回の競技で、毎回上位から10名ほどが脱落 ▪ did0esは2021年度の競技で5〜7位ぐらいから2位まで上がった🥈 •
原因として多いもの ◦ 採点のVRTが落ちる(UI崩れ) ◦ ⼀部ページが開けない
WSHはデグレに厳しい👺
でも実際のサービスでデグレったら...😰
歴代のWeb Speed Hackathonの 出題から考える デグレしないパフォーマンス改善
推測より計測、だが... • そもそも重すぎて計測できない ◦ 計測ツールがタイムアウト ◦ 計測完了が超遅い ◦ 競技の性質上、これの待ちに時間を割けない ▪
実際の業務でもあまり時間をここに割きたくない ◦ 測れないと着⼿が難しい箇所も
まずはUI以外で⼿を加えれば確実に 改善につながる箇所を探す
UI以外で⼿を加えれば確実に改善につながる箇所の例 • ビルドツールの設定ミス ◦ 開発向けの設定で本番に出している ◦ サポート外のブラウザもサポートしようとしている • 重いパッケージを使っている ◦
Polyfillや富豪的にリソースを使うパッケージが散在 • ブラウザのレンダリング遅延 ◦ ⼤量 or 重い同期的な処理 ◦ シーケンシャルなAPIコール • 応答が遅いAPI ◦ GraphQLのN+1 ◦ スロークエリ
ビルドツールの設定ミス:2020年 • Webpack関連 ◦ source mapsやmodeなどを本番向けに変える • Babel関連 ◦ サポート外のブラウザ向けにトランスパイルしない
• PostCSS関連 ◦ 不要なCSSをパージする 参考 :https://github.com/CyberAgentHack/web-speed-hackathon-2020/wiki/Web-Speed-Hackatho n-Online-%E5%87%BA%E9%A1%8C%E3%81%AE%E3%81%AD%E3%82%89%E3%81%84%E3 %81%A8%E8%A7%A3%E8%AA%AC
重いパッケージを使っている:2022年 • Bundle Analyzerやnpm lsなどでサイズを測って⼤きいものから剥がす • 以下2022年度に⽤いられた中で代表的なもの ◦ Polyfill系 ▪
core-jsなどでサポート外のブラウザ向けのものは消す ◦ momentjs ▪ date-fnsやdayjsなど、軽量なものに変える ◦ lodash ▪ lodash-esや⽣JSに変える(You-Dont-Need-Lodash-Underscore) ◦ zengin-code ▪ バックエンドに持っていくか、Webpackでチャンク分割して遅延ロード ◦ axios ▪ Fetch APIに変える 参考:https://developers.cyberagent.co.jp/blog/archives/40123/
ブラウザのレンダリング遅延:2021, 2023年 • <script>が同期的 ◦ deferで並⾏にする • リソースの読み込み順のミス ◦ 読み込みの優先度を変える
▪ 計測が必要 ▪ prefetchやpreloadなどを適切に使う • APIのコール順やコールするタイミングのミス ◦ 依存関係のないAPIはPromise.allなどで並列に ◦ Intersection Observerで画⾯に⼊ったタイミングでAPIコール 参考:https://zenn.dev/monica/articles/7e060938f72073
応答が遅いAPI:2023, 2025年 • やることがISUCONっぽいが、WSHでも有効 • [2023] N+1問題 ◦ GraphQLでN+1が発⽣することがある ▪
DataLoader などを使って対処する • [2025] スロークエリ ◦ インデックスを張る ◦ レスポンスサイズを削るためにlimitをつける 参考:https://zenn.dev/shun_shobon/articles/173450f5bec890
これでやっとUIに着⼿できる...✨
None
UIに⼿を加える前に • まず現状と向き合う ◦ よっしゃ改善やるぞうぉぉ!!!と前のめりになりがち ◦ 推測より計測 • テストを正とする ◦
テストが落ちなければ、挙動のデグレはないと⾒做せる ◦ 特にE2E(VRT)を整備する ▪ 年度によってはローカル実⾏向けのE2Eが組まれている状態で提供 ◦ ユニットテストで⼩さくはじめても◯
UI関連の改善の例 • CSSの値をJSなどで計算する ◦ アニメーション ◦ 過去にJSでしか出来なかったUIの表現 • マルチメディアのサイズが⼤きい ◦
画像 ◦ 動画 ◦ アイコン系 • フォントを無駄に読み込んでいる ◦ 使わない⽂字まで読み込んでいる ◦ CLSを引き起こすような使い⽅
CSSの値をJSなどで計算する:2022, 2024年 • [2022] アニメーションにframer-motionなどを使っている ◦ アニメーションライブラリ⾃体が重いケース • [2022] 画像がCanvas
◦ JSでobject-fit的なことをしてCanvasに描画している • [2024] 画像がCanvas + シェーダー ◦ ThreejsとGLSLでobject-fit的なことをしてCanvasに描画している 2024年のやつは 私が作りました
マルチメディアのサイズが⼤きい:2022年 • 画像はSquooshなどで、動画はFFmpegなどで圧縮する ◦ VRTが落ちない程度にサイズを減らす ◦ オンデマンドで圧縮はさける。事前に圧縮(WSHでよくある罠) • ファイルの形式を変える ◦
画像はWebPやAVIFのようなサイズの⼩さい形式に変換 • アイコン系ライブラリの使い⽅を⾒直す、置き換える ◦ アイコンを全て読み込むような使い⽅になっているケースも ◦ 少なければ画像に1つずつ書き出してCDNなどに配置
フォントを無駄に読み込んでいる:2020, 2022年 • フォントのサブセット化 ◦ フォントファイルは subset-font などでサブセット化 ◦ Google
Fontsの場合は &text= で使⽤⽂字を指定してサブセット化 • その他サブセット化の参考 ◦ https://blog.jxck.io/entries/2016-03-14/web-font-noto-sans.html ◦ https://blog.jxck.io/entries/2019-10-13/font-feature-settings.html ◦ https://blog.jxck.io/entries/2020-09-07/font-subsetting-with-puppeteer.html
おわりに • あくまで計測が優先 ◦ 計測が思うようにできないときにはじめて推測する • 計測がままならない場合、UI以外から着⼿ ◦ UI以外で⼿を加えれば確実に改善できる箇所を探す •
UI関連に着⼿する前にテストを整備 ◦ 特にE2EとVRT • ここで取り上げた問題以外にも、WSHでは様々な出題が⾏われています ◦ みなさんも是⾮参加してみてください!
ご清聴ありがとうございました