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
歴代の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
940
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
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
0
120
【前編】このAPIいつ使うん?あの機能なに?V8のドキュメント、全部読んでみた
shuta13
0
160
TypeScript Compiler APIとPHP-Parserを活用し、TypeScriptとPHPで型を共有する
shuta13
1
1k
ブラウザの投機的読み込みと投機ルールAPIを理解し、Webサービスのパフォーマンスを最適化する
shuta13
3
400
うわっ...私のSwagger、古すぎ...?grpc-gateway向けのSwaggerと向き合う
shuta13
0
230
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
400
Reconciliationの世界
shuta13
0
31
なぜクラウドサービスで Web コンソールを提供するのか
shuta13
4
2.5k
5分でわかるPreactのVDOMで作るWebエディタ
shuta13
0
290
Other Decks in Technology
See All in Technology
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
530
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.2k
プロダクト価値を、 チームが使える判断軸に変える
vivion
0
130
Deep Data Security 機能解説
oracle4engineer
PRO
2
730
オンラインゲームのシステム全体像 - コロプラ 2026年度 新卒研修
colopl
0
930
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
190
不可逆な意思決定を避けながら10億超の顧客データを AI Ready にするデータ基盤設計
baseballyama
1
180
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.1k
おそらく日本で唯一のDevRelインターン生として
husengs7
0
170
分析AIエージェントを育てる、動く環境を育てる
codatum
1
380
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
410
OSC2026on_the-world-is-waiting-for-your-voice.pdf
naruoga
0
360
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
860
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Designing for Performance
lara
612
70k
Product Roadmaps are Hard
iamctodd
55
13k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Bash Introduction
62gerente
615
220k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
470
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
A Modern Web Designer's Workflow
chriscoyier
699
190k
Utilizing Notion as your number one productivity tool
mfonobong
4
610
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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では様々な出題が⾏われています ◦ みなさんも是⾮参加してみてください!
ご清聴ありがとうございました